在JAVA中使用DES算法文档格式.docx
《在JAVA中使用DES算法文档格式.docx》由会员分享,可在线阅读,更多相关《在JAVA中使用DES算法文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
二、ECB模式
DESECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
三、CBC模式
DESCBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。
其实现的机理如下:
加密步骤如下:
1)首先将数据按照8个字节一组进行分组得到D1D2……Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4)之后的数据以此类推,得到Cn
5)按顺序连为C1C2C3……Cn即为加密结果。
解密是加密的逆过程,步骤如下:
1)首先将数据按照8个字节一组进行分组得到C1C2C3……Cn
2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:
一定是先解密再异或)
3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2
4)之后依此类推,得到Dn
5)按顺序连为D1D2D3……Dn即为解密结果。
这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。
**
*DES算法
*/
publicclassDES{
/**
*
*@returnDES算法密钥
publicstaticbyte[]generateKey(){
try{
//DES算法要求有一个可信任的随机数源
SecureRandomsr=newSecureRandom();
//生成一个DES算法的KeyGenerator对象
KeyGeneratorkg=KeyGenerator.getInstance(”DES”);
kg.init(sr);
//生成密钥
SecretKeysecretKey=kg.generateKey();
//获取密钥数据
byte[]key=secretKey.getEncoded();
returnkey;
}catch(NoSuchAlgorithmExceptione){
System.err.println(”DES算法,生成密钥出错!
”);
e.printStackTrace();
}
returnnull;
/**
*加密函数
*@paramdata
*
加密数据
*@paramkey
密钥
*@return返回加密后的数据
publicstaticbyte[]encrypt(byte[]data,byte[]key){
//从原始密钥数据创建DESKeySpec对象
DESKeySpecdks=newDESKeySpec(key);
//创建一个密匙工厂,然后用它把DESKeySpec转换成
//一个SecretKey对象
SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(”DES”);
SecretKeysecretKey=keyFactory.generateSecret(dks);
//usingDESinECBmode
Ciphercipher=Cipher.getInstance(”DES/ECB/PKCS5Padding”);
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,secretKey,sr);
//执行加密操作
byteencryptedData[]=cipher.doFinal(data);
returnencryptedData;
}catch(Exceptione){
System.err.println(”DES算法,加密数据出错!
*解密函数
解密数据
*@return返回解密后的数据
publicstaticbyte[]decrypt(byte[]data,byte[]key){
//byterawKeyData[]=/*用某种方法获取原始密匙数据*/;
//从原始密匙数据创建一个DESKeySpec对象
//创建一个密匙工厂,然后用它把DESKeySpec对象转换成
cipher.init(Cipher.DECRYPT_MODE,secretKey,sr);
//正式执行解密操作
bytedecryptedData[]=cipher.doFinal(data);
returndecryptedData;
System.err.println(”DES算法,解密出错。
publicstaticbyte[]CBCEncrypt(byte[]data,byte[]key,byte[]iv){
//Cipher对象实际完成加密操作
Ciphercipher=Cipher.getInstance(”DES/CBC/PKCS5Padding”);
//若采用NoPadding模式,data长度必须是8的倍数
//Ciphercipher=Cipher.getInstance(”DES/CBC/NoPadding”);
IvParameterSpecparam=newIvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE,secretKey,param);
/**
publicstaticbyte[]CBCDecrypt(byte[]data,byte[]key,byte[]iv){
//usingDESinCBCmode
IvParameterSpecparam=newIvParameterSpec(i