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 加密的主要内容,如果未能解决你的问题,请参考以下文章