如果我尝试使用密钥“qwertykey”加密“123456”并在在线工具https://www.tools4noobs.com/online_tools/encrypt/中获得“UVEXg9fgBxo =”的响应
但是,如果我使用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 :(得分:0)
DES仅支持56位密钥大小(64位带奇偶校验)。所以你不能使用更大的密钥。 Mcrypt知道这一点并且默默地只使用前8个字节。 Mcrypt也没有实现适当的填充。相反,它填充0x00字节。您应该能够在BouncyCastle中使用类似但不相同的填充:
Cipher.getInstance("DES/ECB/ZeroBytePadding", "BC");
永远不要使用ECB mode。它具有确定性,因此在语义上不安全。您应该至少使用CBC或CTR等随机模式。最好对您的密文进行身份验证,以便无法进行填充oracle攻击等攻击。这可以通过GCM或EAX等经过身份验证的模式,或者使用加密然后MAC方案来完成。
注意 DES不应该用于新开发项目。