Android DES解密ECB模式

时间:2016-02-11 12:25:28

标签: android encryption des

我正在尝试解密数据,
用mcrypt加密的 DES,ECB模式
然后包装到Base64中。 这是我的代码:

static {
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}
// ...

// Crypted input data and the key
String criptedInput = "vsm1/sLWAUxW7JjKT/Amww==";
final String KEY = "jf7746yghndd";

// Decoding base64
byte[] bytesDecoded = Base64.decodeBase64(criptedInput.getBytes());

SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "DES");

Cipher cipher = null;
String result = null;

try {
    cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC");

    // Initialize the cipher for decryption
    cipher.init(Cipher.DECRYPT_MODE, key);

    // Decrypt the text
    byte[] textDecrypted = cipher.doFinal(bytesDecoded);

    result = new String(textDecrypted);

} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    e.printStackTrace();
} catch (NoSuchPaddingException e) {
    e.printStackTrace();
} catch (IllegalBlockSizeException e) {
    e.printStackTrace();
} catch (BadPaddingException e) {
    e.printStackTrace();
} catch (InvalidKeyException e) {
    e.printStackTrace();
}

现在我抓java.security.invalidkeyexception:des key太长了 - 应该是8个字节..

有什么问题?

1 个答案:

答案 0 :(得分:2)

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

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

绝不使用ECB mode 。它是确定性的,因此在语义上不安全。您应该至少使用CBCCTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过身份验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。