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