KDC 与 一次一密

密钥分发中心(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();  
        }  
    }
    */
}

Ocean
1.6k 声望74 粉丝

Mobaxterm