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(); } } */ }