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 根本不应该用于新的开发。