KDC 與 一次一密java
上圖爲KDC模型:
Kerberos 提供一種較好的解決方案,它是由MIT發明的,Kerberos創建了一個安全的、可信任的密鑰分發中心(KDC, Key Distribution Center)
用戶A要想申請與用戶B對話,他必須按照如下幾個步驟進行:
①、A向KDC申請與B對話;
②、KDC用KDC與B之間的公鑰加密隨機生成一個標籤;
③、KDC將這個標籤再用KDC與A之間的公鑰加密並傳給A;
④、A用私鑰解密獲得標籤;
⑤、A將這個標籤傳給B
⑥、B用私鑰解開標籤,從而確認A、B之間的信任關係算法
對不可破解的緣由仍是不是很理解!!!
數組
即便解決了密鑰的分配和存儲問題,還需確信發方和收方是徹底同步的。若是收方有一比特的偏移(或者一些比特在傳送過程當中丟失了),消息就變成亂的了。另外一方面,若是某些比特在傳送中被改變了(沒有增減任何比特,更像因爲隨機噪聲引發的),那些改變了的比特就不能正確地解密。再者,一次一密亂碼本不提供鑑別。
一次一密亂碼本在今天仍有應用場合,主要用於高度機密的低帶寬信道。安全
import java.security.SecureRandom; import java.util.Random; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * * @author * 一次一密的DES加密算法 */ public class OnceDES { /** * 加密 */ public static byte[] desCrypto(byte[] datasource, String password) { try{ SecureRandom random = new SecureRandom(); DESKeySpec desKey = new DESKeySpec(password.getBytes()); //建立一個密匙工廠,而後用它把DESKeySpec轉換成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(desKey); //Cipher對象實際完成加密操做 Cipher cipher = Cipher.getInstance("DES"); //用密匙初始化Cipher對象 cipher.init(Cipher.ENCRYPT_MODE, securekey, random); //如今,獲取數據並加密 //正式執行加密操做 return cipher.doFinal(datasource); }catch(Throwable e){ e.printStackTrace(); } return null; } /** * 解密(因爲是對稱加密算法,加密與解密使用相同的密鑰) */ public static byte[] decrypt(byte[] src, String password) throws Exception { // DES算法要求有一個可信任的隨機數源 SecureRandom random = new SecureRandom(); // 建立一個DESKeySpec對象 DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 建立一個密匙工廠 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 將DESKeySpec對象轉換成SecretKey對象 SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher對象實際完成解密操做 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher對象 cipher.init(Cipher.DECRYPT_MODE, securekey, random); // 真正開始解密操做 return cipher.doFinal(src); } public static String getPassword() { //密碼,長度要是8的倍數 String password=""; Random rand = new Random(); int flag; //產生8位隨機數,隨機數由數字和字母組成。這8位數組成密碼 for(int i=1;i<=8;i++) { int t; flag=rand.nextInt(3); if(flag==0) { t=rand.nextInt(10)+48; } else if(flag==1) {t=rand.nextInt(26)+65;} else {t=rand.nextInt(26)+97;} password+=(char)t; } return password; } /* * main函數 */ /* public static void main(String[] argv) throws IOException{ OnceDES des=new OnceDES(); //讀取待加密內容 String str=""; FileReader fr=new FileReader("test-1.txt"); //能夠換成工程目錄下的其餘文本文件 BufferedReader br=new BufferedReader(fr); String temp=br.readLine(); while(temp!=null){ str+=temp; temp=br.readLine(); } br.close(); System.out.println(str); //密碼,長度要是8的倍數 String password=""; Random rand = new Random(); int flag; //產生8位隨機數,隨機數由數字和字母組成。這8位數組成密碼 for(int i=1;i<=8;i++) { int t; flag=rand.nextInt(3); if(flag==0) { t=rand.nextInt(10)+48; } else if(flag==1) {t=rand.nextInt(26)+65;} else {t=rand.nextInt(26)+97;} password+=(char)t; } System.out.println(password); byte[] result = des.desCrypto(str.getBytes(),password); System.out.println("加密後內容爲:"+new String(result)); //直接將如上內容解密 try { byte[] decryResult = des.decrypt(result, password); System.out.println("解密後內容爲:"+new String(decryResult)); } catch (Exception e1) { e1.printStackTrace(); } } */ }