KDC 與 一次一密

KDC 與 一次一密java

密鑰分發中心(KDC, Key Distribution Center)

模型

3f4052107d85bd99f37f1

上圖爲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之間的信任關係算法

一次一密

概念

clipboard.png

對不可破解的緣由仍是不是很理解!!!數組

即便解決了密鑰的分配和存儲問題,還需確信發方和收方是徹底同步的。若是收方有一比特的偏移(或者一些比特在傳送過程當中丟失了),消息就變成亂的了。另外一方面,若是某些比特在傳送中被改變了(沒有增減任何比特,更像因爲隨機噪聲引發的),那些改變了的比特就不能正確地解密。再者,一次一密亂碼本不提供鑑別。
一次一密亂碼本在今天仍有應用場合,主要用於高度機密的低帶寬信道。安全

DES一次一密Demo(Java實現)

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();  
        }  
    }
    */
}
相關文章
相關標籤/搜索