作者bukiya (武器店)
看板AndroidDev
标题Re: [问题] 有关於triple des加解密
时间Fri May 25 00:55:16 2012
: 试了一下,直接使用上面所说的des文章,
: 照上面所想的做了一下,
: 发现在第一阶段完後就会直接catch Exception後跳出了,
: 後来查阅了一下java中3des的做法
: 将DES.java档中的
: SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
: 改为
: SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DESede");
: 结果依然是在第二步的地方,要取得dk2的时候就跳到catch exception
: (原因是因为dk2会=null)
: 不知道这里下一步该怎麽解决...恳请大大们帮忙QQ
java有支援DESede的加解密模式,所以把程式改成下面这样应该就可以了
先产生一把3DES的Key (168 bits)
public static String encrypt3DES (String encryptString, String encryptKey)
throws Exception {
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(),
"DESede");
Cipher cipher = Cipher.getInstance(
"DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
}
要测试有没有问题,先加密再解密,看最後输出的字串或byte和一开始的
有没有相同就知道了。
如果要使用mode和padding,要改 Cipher.getInstance 的输入字串
ex. Cipher.getInstance(
"DESede/CBC/PKCS5Padding")
字串的格式是 "algorithm/mode/padding"
java有支援的加解密方法可参考
http://ppt.cc/meL@
如果有选mode,有些mode(如CBC, CFB, OFB..)
需要输入 initialization vector (iv)
这时候就要产生iv,和你po的文件一样,然後init时要加入
IvParameterSpec zeroIv = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
使用mode是要提高安全性,基本的block cipher (DES, 3DES, AES, ...) 有缺点,
同样的明文,加密後的密文是相同的,所以可以观查密文相同字串的出现率,
推测出可能的明文字串,像英文中有一些字母使用率很高,
可以发现相同的密文一直出现,为改善这个缺点,才会有各种加密mode的产生。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.192.21.123
1F:推 nightwolf013:谢谢大大,不过我试过,改成DESed~值会变null 05/25 09:50
2F:→ nightwolf013:目前还不知道是哪里的问题...QQ 05/25 09:51
3F:→ bukiya:先 String key = "123456712345671234567"; 然後 05/25 13:20
4F:→ bukiya:new SecretKeySpec(key.getBytes(), "DESede") 应该ok 05/25 13:24
5F:→ bukiya:然後网页中Base64编码好像怪怪的,建议先用byte[]处理 05/25 13:27
6F:推 nightwolf013:已解决,谢谢bukiya大大,现在已成功的解决3des的做法 05/25 14:24
7F:→ nightwolf013:希望这些资料对以後要做到的朋友有用^^ 05/25 14:25