作者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
推 nightwolf013:謝謝大大,不過我試過,改成DESed~值會變null 05/25 09:50
→ nightwolf013:目前還不知道是哪裡的問題...QQ 05/25 09:51
→ bukiya:先 String key = "123456712345671234567"; 然後 05/25 13:20
→ bukiya:new SecretKeySpec(key.getBytes(), "DESede") 應該ok 05/25 13:24
→ bukiya:然後網頁中Base64編碼好像怪怪的,建議先用byte[]處理 05/25 13:27
推 nightwolf013:已解決,謝謝bukiya大大,現在已成功的解決3des的做法 05/25 14:24
→ nightwolf013:希望這些資料對以後要做到的朋友有用^^ 05/25 14:25