Android 中的 DES 加密

Posted

技术标签:

【中文标题】Android 中的 DES 加密【英文标题】:DES Encryption in Android 【发布时间】:2017-07-10 05:16:29 【问题描述】:

如果我尝试使用密钥 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;

【问题讨论】:

catch 块中打印异常... 确保使用与在线工具相同的参数(模式、iv)(顺便说一句有点可疑)。 你是用海绵城堡罐子加解密吗?? DES 不再安全。代码中的关键用法也不是最好的方法。检查 this 库以获取 AES 算法的安全实现。 【参考方案1】:

DES 仅支持 56 位(带奇偶校验的 64 位)的密钥大小。所以你不能使用更大的密钥。 Mcrypt 知道这一点并且默默地只使用前 8 个字节。 Mcrypt 也没有实现正确的填充。相反,它用 0x00 字节填充。您应该能够在 BouncyCastle 中使用类似但不相同的填充:

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

永远不要使用ECB mode。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,例如 CBC 或 CTR。最好对您的密文进行身份验证,这样就不会发生像填充预言攻击这样的攻击。这可以通过 GCM 或 EAX 等经过身份验证的模式或使用先加密后 MAC 方案来完成。

注意 DES 根本不应该用于新的开发。

【讨论】:

是的,没错

以上是关于Android 中的 DES 加密的主要内容,如果未能解决你的问题,请参考以下文章

Android 加密之DES加密

android Aes加密解密和Des加密解密

[android]DES/3DES/AES加密方式

android -------- DES加密解密算法

Android工具类怎样保证Android与server的DES加密保持一致

Java android DES+Base64加密解密