我正在尝试解密数据,
用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个字节..
有什么问题?
答案 0 :(得分:2)
DES仅支持56位密钥大小(64位带奇偶校验)。所以你不能使用更大的密钥。 Mcrypt知道这一点并且默默地只使用前8个字节。 Mcrypt也没有实现正确的填充。相反,它填充0x00字节。您应该能够在BouncyCastle中使用类似但不相同的填充:
Cipher.getInstance("DES/ECB/ZeroBytePadding", "BC");
绝不使用ECB mode 。它是确定性的,因此在语义上不安全。您应该至少使用CBC或CTR等随机模式。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以使用经过身份验证的模式(如GCM或EAX)或encrypt-then-MAC方案来完成。