【发布时间】:2017-02-14 22:13:10
【问题描述】:
我在我的 android 应用程序中使用以下代码来加密 Triple DES 中的字符串,使用 Encrypted Code Book (ECB) 模式和三个独立的密钥(又名 3DESede),它们以 24 字节大小的密钥数组的形式提供。因此我使用Java Crypto API。这工作得很好,但是如果我加密一个 8 个字符的字符串,我会得到一个 16 字节的密文,这不应该发生,因为 3DES 在 64 位(相应的 8 字节)块上运行。 PKCS5 padding 同样适用,因为它也适用于 64 位块。所以我的问题是导致这个问题的原因是什么?
private static byte[] encryptText(String plaintext, byte[] keyBytes) throws Exception {
// Get plaintext as ASCII byte array
final byte[] plainBytes;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
plainBytes = plaintext.getBytes(StandardCharsets.US_ASCII);
} else {
plainBytes = plaintext.getBytes("US-ASCII");
}
// Generate triple DES key from byte array
final DESedeKeySpec keySpec = new DESedeKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey key = keyFactory.generateSecret(keySpec);
// Setup the cipher
final Cipher c3des = Cipher.getInstance("DESede/ECB/PKCS5Padding");
c3des.init(Cipher.ENCRYPT_MODE, key);
// Return ciphertext
return c3des.doFinal(plainBytes);
}
【问题讨论】:
-
1.最好不要在新代码中使用 3DES,AES 是当前的对称加密标准。 2.不要使用ECB模式,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密,它不需要不保密。 3. 加密容易,使用安全难。
标签: java android encryption 3des