2017-07-10 142 views
0

,如果我嘗試加密「123456」與關鍵「qwertykey」,並得到響應,「UVEXg9fgBxo =」在線工具https://www.tools4noobs.com/online_tools/encrypt/DES加密android系統

但是,如果使用Android的代碼我得到「2XQNkfXlN6E =」作爲加密值

我的代碼是

public String encrypt(String plainTextPassword){ 
String encrypted = ""; 
try{ 
DESKeySpec keySpec = new DESKeySpec("qwertykey".getBytes()); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
SecretKey key = keyFactory.generateSecret(keySpec); 
byte[] cleartext = plainTextPassword.getBytes(); 

Cipher cipher = Cipher.getInstance("DES"); // cipher is not thread safe 
cipher.init(Cipher.ENCRYPT_MODE, key); 
encrypted = Base64.encodeToString(cipher.doFinal(cleartext),Base64.DEFAULT); 

}catch (Exception e){ 

} 
return encrypted; 
} 

任何人都可以請幫我實現這一

+0

「catch」塊中的打印異常... – ELITE

+0

請確保您使用與在線工具相同的參數(模式,iv)(順便提一下,這個參數有點兒可疑)。 – Henry

+0

你使用海綿城堡罐進行加密和解密嗎? –

回答

0

DES只支持56位的密鑰長度(64位與帕裏TY)。所以你不能使用更大的鑰匙。 Mcrypt知道這一點,並默默地只使用前8個字節。 Mcrypt也沒有實現適當的填充。相反,它填充0x00字節。你應該能夠在BouncyCastle的使用相似,但不盡相同,填充:

Cipher.getInstance("DES/ECB/ZeroBytePadding", "BC"); 

切勿使用ECB mode。它是確定性的,因此不具有語義安全性。您至少應該使用CBC或CTR等隨機模式。最好是驗證你的密文,這樣攻擊就像填充甲骨文攻擊是不可能的。這可以通過驗證模式(如GCM或EAX)或使用加密後MAC模式來完成。

備註 DES不應該用於新的開發。

+0

是的,這是真的 –