【发布时间】:2011-12-26 22:52:53
【问题描述】:
我正在尝试使用 rijndael 加密字符串(密钥大小 256 位,块大小 256 位,CFB 模式) 目前我正在做这样的事情:
BufferedBlockCipher c = new BufferedBlockCipher(new CFBBlockCipher(new RijndaelEngine(256), 256));
c.init(false, new ParametersWithIV(new KeyParameter(keybytes), iv));
我可以很好地加密和解密我自己的东西。不幸的是,我必须解密的字符串来自 php 中的 mcrypt。
我无法解密这个字符串,我猜失败在我这边。谁能给我一个示例如何使用所需参数配置密码?
编辑:
遵循此处和 php 文档 cmets 中的一些建议。我将密码更改为:
PaddedBufferedBlockCipher c = new PaddedBufferedBlockCipher(new CFBBlockCipher(new RijndaelEngine(256)), new ZeroBytePadding());
加密仍然不兼容。
编辑 2
让它在 CBC 模式下工作。我猜问题出在 iv 的某个地方。
【问题讨论】:
-
我做了一个 php-java 加密/解密并且很难做到。据我记得,我必须对输入进行填充才能使交叉加密/解密工作。
-
似乎填充不是问题。
-
您确定您在 Java 中使用的 IV 与您在 PHP 中使用的 IV 相同吗?另请阅读:stackoverflow.com/questions/7821678/…
-
是的,目前(用于测试)iv 是硬编码的。出于偏执,我们从 base64 字符串生成它。钥匙也是如此。相同的键,相同的 iv ...
-
零填充不是一个好的方案,因为如果数据以 00h 结尾,你就会遇到麻烦。只有在解密前知道纯数据的长度时,才能使用零填充。如果您正在解密,您始终可以尝试在没有填充方案的情况下进行解密,并查看内容和填充字节的外观。如果它们与预期不同,则不是填充。然而,密钥或 IV 似乎更有可能存在解码或解释差异。我们需要更多代码来查看那里发生了什么。
标签: java encryption bouncycastle rijndael