CBC 模式的三重 DES:java.security.InvalidAlgorithmParameterExcepti



我正在尝试在java中使用CBC模式实现3DES加密/解密。

初始化向量为 000000000000000000
加密字符串DD446C051A83BFD98144C348935C61D81398CF29CCFE1CCD
解密密钥DCBA4F836E45BAB04FAB2937454075D9

我收到以下错误。 任何帮助将不胜感激。谢谢。

java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 8 bytes long

法典:

import java.security.Key; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESedeKeySpec; 
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Base64; 
public class DES3 { 
private static final String IV = "01234567"; 
private static final String CHARSET = "utf-8"; 
public static String decrypt(String iv, String secretKey, String encryptText) throws Exception { 
DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 
Key deskey = keyfactory.generateSecret(spec); 
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 
IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 
cipher.init(Cipher.DECRYPT_MODE, deskey, ips); 
byte[] decryptData = cipher.doFinal(Base64.decodeBase64(encryptText)); 
return new String(decryptData, CHARSET); 
} 
public static String decrypt(String secretKey, String encryptText) throws Exception { 
return decrypt(IV, secretKey, encryptText); 
} 
public static void main(String[] args) {
try {
String iv="0000000000000000";
System.out.println("iv size"+iv.getBytes("UTF8").length);
decrypt(iv, "DCBA4F836E45BAB04FAB2937454075D9", "DD446C051A83BFD98144C348935C61D81398CF29CCFE1CCD");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

你的问题在这里:

String iv="0000000000000000";

这表明您的 IV 是十六进制字符串。但是在您的解密函数中,您使用:

iv.getBytes()

为此四.这显然超过 16 个字节长。您需要将十六进制字符串转换为字节,而不仅仅是使用getBytes()函数getBytes()将每个聊天转换为相应的 ASCII 代码,因此您将获得一个0x3016 字节的数组,而不是0获得每个 8 字节的数组。

顺便说一下,您的密钥和输入也有同样的问题。

你可以在这里检查hexStringToByteArray()。

相关内容

  • 没有找到相关文章

最新更新