解密DES / CBC / ZeroBytePadding数据

时间:2017-11-02 19:47:25

标签: java encryption jce

我有一个解密令牌所需的令牌和秘密。我不确定我做错了什么,我一直得到"非法密钥大小"。我的密钥大小是44个字节。我在一个静态块中添加了BouncyCastleProvider。下面是我想要做的一小部分。

SecretKeySpec skeySpec = new SecretKeySpec(keyText.getBytes(), "DES");
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC");
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8]));
byte[] tokenData = des.doFinal(Base64.decodeBase64(token));

2 个答案:

答案 0 :(得分:3)

DES的密钥大小为56位,8字节,每个字节的lsb保留用于奇偶校验,但通常被忽略。

所以“我的密钥大小是44个字节”是不正确的。

接下来,用于解密的IV必须与用于加密的IV相同。 DES的块大小为8字节,因此IV需要为8字节。处理IV的一种通用方法是使用加密数据作为前缀,IV不需要保密。

最后,零填充通常不是一个好的解决方案,它不支持可能以零字节结束的二进制数据。 PKCS#5是通常使用的填充。

答案 1 :(得分:1)

我的猜测是你的keyText是Base64编码的。您应该解码它以获得32字节的byte []。在Java 8中,您可以执行以下操作:

byte[] key = java.util.Base64.getDecoder().decode(keyText.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(key, "DES");
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC");
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8]));
byte[] tokenData = des.doFinal(Base64.decodeBase64(token));

这个问题有关于Base64的更多信息。 Converting Secret Key into a String and Vice Versa

我仍然认为你会得到无效的密钥大小错误。 DES密钥是否为56位(加上8个奇偶校验位)?因此,只有8个字节长而不是44个,或者我认为你解码Base64时会得到32个。