接下来我们介绍对称加密算法最常用的莫过于DES数据加密算法
DES
DESData Encryption Standard即数据加密算法是IBM公司于年研究成功并公开发表的DES算法的入口参数有三个KeyDataMode其中Key为个字节共位是DES算法的工作密钥Data也为个字节位是要被加密或被解密的数据Mode为DES的工作方式有两种加密或解密
DES算法把位的明文输入块变为位的密文输出块它所使用的密钥也是位
通过java代码实现如下
importjavasecurityKey;
importjavasecuritySecureRandom;
importjavaxcryptoCipher;
importjavaxcryptoKeyGenerator;
importjavaxcryptoSecretKey;
importjavaxcryptoSecretKeyFactory;
importjavaxcryptospecDESKeySpec;
/***//**
*DES安全编码组件authorby;
*
*<pre>
*支持DESDESede(TripleDES就是DES)AESBlowfishRCRC(ARCFOUR)
*DESkeysizemustbeequalto
*DESede(TripleDES)keysizemustbeequaltoor
*AESkeysizemustbeequaltoorbutandbitsmaynotbeavailable
*Blowfishkeysizemustbemultipleofandcanonlyrangefromto(inclusive)
*RCkeysizemustbebetweenandbits
*RC(ARCFOUR)keysizemustbebetweenandbits
*具体内容需要关注JDKDocument&///docs/technotes/guides/security/l
*</pre>
*
*@author梁栋
*@version
*@since
*/
publicabstractclassDESCoderextendsCoder{
/***//**
*ALGORITHM算法<br>
*可替换为以下任意一种算法同时key值的size相应改变
*
*<pre>
*DESkeysizemustbeequalto
*DESede(TripleDES)keysizemustbeequaltoor
*AESkeysizemustbeequaltoorbutandbitsmaynotbeavailable
*Blowfishkeysizemustbemultipleofandcanonlyrangefromto(inclusive)
*RCkeysizemustbebetweenandbits
*RC(ARCFOUR)keysizemustbebetweenandbits
*</pre>
*
*在KeytoKey(byte[]key)方法中使用下述代码
*<code>SecretKeysecretKey=newSecretKeySpec(keyALGORITHM);</code>替换
*<code>
*DESKeySpecdks=newDESKeySpec(key);
*SecretKeyFactorykeyFactory=SecretKeyFactorygetInstance(ALGORITHM);
*SecretKeysecretKey=keyFactorygenerateSecret(dks);
*</code>
*/
publicstaticfinalStringALGORITHM=DES;
/***//**
*转换密钥<br>
*
*@paramkey
*@return
*@throwsException
*/
privatestaticKeytoKey(byte[]key)throwsException{
DESKeySpecdks=newDESKeySpec(key);
SecretKeyFactorykeyFactory=SecretKeyFactorygetInstance(ALGORITHM);
SecretKeysecretKey=keyFactorygenerateSecret(dks);
//当使用其他对称加密算法时如AESBlowfish等算法时用下述代码替换上述三行代码
//SecretKeysecretKey=newSecretKeySpec(keyALGORITHM);
returnsecretKey;
}
/***//**
*解密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]decrypt(byte[]dataStringkey)throwsException{
Keyk=toKey(decryptBASE(key));
Ciphercipher=CiphergetInstance(ALGORITHM);
cipherinit(CipherDECRYPT_MODEk);
returncipherdoFinal(data);
}
/***//**
*加密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]encrypt(byte[]dataStringkey)throwsException{
Keyk=toKey(decryptBASE(key));
Ciphercipher=CiphergetInstance(ALGORITHM);
cipherinit(CipherENCRYPT_MODEk);
returncipherdoFinal(data);
}
/***//**
*生成密钥
*
*@return
*@throwsException
*/
publicstaticStringinitKey()throwsException{
returninitKey(null);
}
/***//**
*生成密钥
*
*@paramseed
*@return
*@throwsException
*/
publicstaticStringinitKey(Stringseed)throwsException{
SecureRandomsecureRandom=null;
if(seed!=null){
secureRandom=newSecureRandom(decryptBASE(seed));
}else{
secureRandom=newSecureRandom();
}
KeyGeneratorkg=KeyGeneratorgetInstance(ALGORITHM);
kginit(secureRandom);
SecretKeysecretKey=kggenerateKey();
returnencryptBASE(secretKeygetEncoded());
}
}
延续上一个类的实现我们通过MD以及SHA对字符串加密生成密钥这是比较常见的密钥生成方式
再给出一个测试类
importstaticorgjunitAssert*;
importorgjunitTest;
/***//**
*
*@authorby;;
*@version
*@since
*/
publicclassDESCoderTest{
@Test
publicvoidtest()throwsException{
StringinputStr=DES;
Stringkey=DESCoderinitKey();
Systemerrprintln(原文:\t+inputStr);
Systemerrprintln(密钥:\t+key);
byte[]inputData=inputStrgetBytes();
inputData=DESCoderencrypt(inputDatakey);
Systemerrprintln(加密后:\t+DESCoderencryptBASE(inputData));
byte[]outputData=DESCoderdecrypt(inputDatakey);
StringoutputStr=newString(outputData);
Systemerrprintln(解密后:\t+outputStr);
assertEquals(inputStroutputStr);
}
}
得到的输出内容如下
原文 DES
密钥 fwEtRrVq=
加密后 CqeoNIzRY=
解密后 DES
由控制台得到的输出我们能够比对加密解密后结果一致这是一种简单的加密解密方式只有一个密钥
其实DES有很多同胞兄弟如DESede(TripleDES)AESBlowfishRCRC(ARCFOUR)这里就不过多阐述了大同小异只要换掉ALGORITHM换成对应的值同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key ALGORITHM)就可以了此外就是密钥长度不同了
/**
* DES key size must be equal to
* DESede(TripleDES) key size must be equal to or
* AES key size must be equal to or but and bits may not be available
* Blowfish key size must be multiple of and can only range from to (inclusive)
* RC key size must be between and bits
* RC(ARCFOUR) key size must be between and bits
**/