1

我正在尝试解密加密文本。我有盐值、迭代次数和密钥长度。但我没有初始化向量 (IV) 值,我该如何进行解密。我也有秘钥。

暂时我正在使用一些大小为 16 字节的随机 IV 值。但我仍然无法正确解密该值。任何人都可以帮忙,因为我坚持了很长时间?


以下是给我的价值观。

salt= EW0h0yUcDX72WU9UiKiCwDpXsJg=, Iteration=128,Keylenght=16.
MasterKeyName="Passphrase1", MACMethod algo = hmac-sha1,    MACKey="jq/NdikC7AZf0Z+HEL5NrCICV8XW+ttzl/8687hVGHceoyJAaFws+111plQH 6Mlg" encrypted kae =   "pM7VB/KomPjq2cKaxPr5cKT1tUZN5tGMI+u1XKJTG1la+ThraPpLKlL2plKk6vQE"   and valuemac="lbu+9OcLArnj6mS7KYOKDa4zRU0=".
Secret key = "xxxxxxxxxxx".

下面是我用来解密的代码。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(secretkey.toCharArray(), salt, iterationCount, keyStrength);    
SecretKey tmp = factory.generateSecret(spec);
key = new SecretKeySpec(tmp.getEncoded(), "AES");
dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameters params = dcipher.getParameters();
iv = "0000000000000000".getBytes();
System.out.println("IV " + new sun.misc.BASE64Encoder().encodeBuffer(iv));
dcipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));      
byte[] decryptedData = new sun.misc.BASE64Decoder().decodeBuffer(base64EncryptedData);
byte[] utf8 = dcipher.doFinal(decryptedData);
4

1 回答 1

1

如果您不知道 IV,则无法解密 CBC 加密密文的第一个块。

但是,您可以检索 IV 值并非不可能:

  • 通常 IV 值是从 PBKDF 生成的密钥字节之后检索到的 16 个字节;
  • IV通常被添加到密文之前,导致在解密过程中在完整明文之前出现一个垃圾块;
  • 不安全,但 IV 也被忽略或设置为常数值,最常见的是全零 IV(这在 CBC 模式中与不使用任何 IV 相同。)
于 2013-06-07T19:58:03.757 回答