enc = Cipher.getInstance("DES/CBC/PKCS5Padding"); keySpec = new SecretKeySpec(key, "DES");//key ivSpec = new IvParameterSpec(iv);//iv enc.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); enc.doFinal(indata);//encrypthtml
DES能够有这几种模式: Electronic Codebook (ECB) , Cipher Block Chaining (CBC) , Cipher Feedback (CFB) , Output Feedback (OFB) 最基本的是ECB模式,CBC和其余模式都是改进。 ECB模式的缺点是相同的明文加密成相同的密文,明文的规律带到密文。\\ 由于DES是一种block cipher,一个block要8个字节,因此要加密的东西要分红8字节的整数倍,不足的就填充。 PKCS5Padding这种填充,填的字节表明所填字节的总数: 好比差三个字节的话填为 @@@@@333 差7个字节就填为 @7777777 没有差就填 88888888 这样只要读出最后一个字节的内容就知道哪些字节是填充的。 其余填充方式还有: ISO10126-2Padding ISO7816-4Padding X9.23Padding TBCPadding ZeroBytePadding算法
http://www.iteye.com/topic/152405dom
http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 加密
DES的几种工做方式spa
第一种电子密本方式(ECB) 将明文分红n个64比特分组,若是明文长度不是64比特的倍数,则在明文末尾填充适当数目的规定符号。对明文组用给定的密钥分别进行加密,行密文C=(C0,C1,……,Cn-1)其中Ci=DES(K,xi),i=0,1,…..,n-1。 第二种密文分组连接方式(CBC) 在CBC方式下,每一个明文组xi在加密前与先一组密文按位模二加后,再送到DES加密,CBC方式克服了ECB方式报内组重的缺点,但因为明文组加密前与一组密文有关,所以前一组密文的错误会传播到下一组。 第三种密文反馈方式(CFB),可用于序列密码 明文X=(x0,x1,……,xn-1),其中xi由t个比特组成0 第四种输出反馈方式(OFB),可用于序列密码 与CFB惟一不一样的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其他都与CFB相同。但它取的是DES的输出,因此它克服了CFB的密文错误传播的缺点 DES的几种填补方式 DES是对64位数据的加密算法,如数据位数不足64位的倍数,须要填充,补充到64位的倍数。code
NoPadding API或算法自己不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,能够补充\0或者空格,而后trimhtm
PKCS5Padding 加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8对象
-------------------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
###### 须要使用到 IV的时候 ########## (*** 注意 :主要在配合其余语言如:C#,.NET。跨接口调用须要注意保持参数的一
致,密钥、偏移量、块密码模式、填充模式)
public class DES {
private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
public static String encryptDES(String encryptString, String encryptKey)
throws Exception {
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); CBC/PKCS5Padding---->>> 密码模式和填充模式
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------》》》》》》》》》》》》》》》
###### 不须要使用到 IV的时候 ##########
/**
* DES加密
*/
public static byte[] desEncrypt(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) {
log.error(e.getMessage(), e);
}
return null;
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
###### 须要使用到 IV的时候 ##########
/**
* DES解密
*/
public static byte[] desDecrypt(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);
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
参考:http://www.cnblogs.com/hubcarl/articles/3109538.html