【问题标题】:How to decrypt pbkdf2 encrypted text without knowing the IV如何在不知道 IV 的情况下解密 pbkdf2 加密文本
【发布时间】:2013-06-23 18:40:21
【问题描述】:

我正在尝试解密加密文本。 我有盐值、迭代次数和密钥长度。但我没有初始化向量 (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);

【问题讨论】:

  • PBKDFv2 是一个散列。它(希望)在数学上是不可能解密的。
  • 当你解密时,你会得到 16 字节的垃圾,然后是正确解密的消息吗?如果是这样,那么密文的前 16 个字节就是 IV。
  • 请注意,能够无异常解密并不意味着您找到了密钥;任何具有正确块大小的密文都会为不使用经过身份验证的加密模式的块密码解密。它只是解密为垃圾。
  • 首先,零IV不包含0字符,它包含设置为零的字节。在 Java 中,您只需创建一个具有正确大小的数组即可实现这一点(因为 Java 用零值初始化字节)。要获取接下来的 16 个字节,您可以使用 factory 生成具有相同大小的 AES 密钥。要检查 IV 是否已预先设置,您需要将密文数组一分为二,我将把它作为作业留给您。如果您的明文超过 1 个块,并且您在第二个块的开头没有看到预期的信息,那么不仅 IV 不正确。
  • 你上面的评论成功了吗?请不要放弃这个问题。不幸的是,我认为在不知道 IV 的情况下我没有其他关于解密的想法(而且不太可能有更多,知道 CBC 模式)......

标签: java encryption


【解决方案1】:

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

然而,您可以检索 IV 值并非不可能:

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

【讨论】:

  • 我已经编辑了我的问题,我已经给出了关于我用来解密的值的详细信息。我尝试了您的建议,但没有得到正确的价值。由于我是这个加密领域的新手,你能建议我做的是对的吗?如果您能将我指向我可以详细了解使用 pskc 加密的网站,那就太好了
  • 不幸的是,我是自以为是的,所以我经常不知道我的信息来自哪里。我也会回复你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 2023-01-03
  • 2018-09-05
  • 2015-02-01
  • 2022-09-24
相关资源
最近更新 更多