KDC 与 一次一密
密钥分发中心(KDC, Key Distribution Center)
模型
上图为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之间的信任关系
一次一密
概念
对不可破解的原因还是不是很理解!!!
即使解决了密钥的分配和存储问题,还需确信发方和收方是完全同步的。如果收方有一比特的偏移(或者一些比特在传送过程中丢失了),消息就变成乱的了。另一方面,如果某些比特在传送中被改变了(没有增减任何比特,更像由于随机噪声引起的),那些改变了的比特就不能正确地解密。再者,一次一密乱码本不提供鉴别。
一次一密乱码本在今天仍有应用场合,主要用于高度机密的低带宽信道。
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();
}
}
*/
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。