有没有办法可以将我的Lockbox 2 Cipher文本转换为LockBox 3 Cipher文本。 我们正在将基于Delphi 2007构建的应用程序迁移到Delphi xe2,我们在Delphi 2007中使用了Lockbox 2 RSA加密算法,我们打算在Delphi xe2中使用lockbox 3来支持Unicode数据。由于两者生成的密文不同,因为Xe2支持Unicode数据,因此我们遇到了问题。所以我们想以某种方式将Lockbox 2生成的密文转换为LockBox 3。
答案 0 :(得分:2)
由于您的密文定义无法识别,因此没有简单的方法可以判断基础明文数据是Ansi还是Unicode ....因此您可能需要管理新的关联属性。
这显然取决于应用程序的布局以及存储此数据的位置以及客户端将如何升级,但可能存在与存储的密文相关联的某种新版本标记。如果它在本地表中说,为PlainTextVersion添加一个新列并将版本设置为某个值以标记密文是从Unicode明文保存的。当读取密文并且这个新字段与Unicdoe标志不匹配时,您可以通过解密来升级密文,并使用Unicode明文加密,然后重新保存密文并设置新标志(或简单地推迟密文版本升级,直到明文发生变化并需要更新。)
或者,更好的是,如果可行的话,一次自动升级所有当前的密文。
答案 1 :(得分:1)
要进行转换,最简单的方法是使用Lockbox 2解密您的密码文本并使用Lockbox 3重新加密。
原因是,据我所知,Lockbox 2填补了RSA block type 2填充的实现,这意味着Lockbox 2的RSA加密与任何其他人的RSA不兼容解密。
Lockbox 2的RSA加密错误地将消息填写如下(通过放置断点并在biBlock.Fi.IntBuf.pBuf处检查内存找到):
message-bytes 0x00 random-padding-bytes 0x02 0x00
e.g。 '测试'被填补到:
$01C883AC 74 65 73 74 00 D4 50 50 test..PP
$01C883B4 A7 BO E5 51 7A 4C C2 BC ...QzL..
$01C883BC 8C B8 69 8A 97 DF AA 1D ..I.....
$01C883C4 78 67 1E OE 8B AB 02 00 xg......
但是应该填写(例如,查看此worked example):
0x00 0x02 random-padding-bytes 0x00 message-bytes
Lockbox 2并不只是反向存储字节(否则消息" test"也会反转)或反转32位小端(否则02 00也会被交换)。只要您使用Lockbox 2进行加密和解密,一切都会正常工作。
另外我注意到另一个错误,其中Lockbox 2调用e.RandomSimplePrime()来生成公共指数e,但它生成一个偶数,即RandomSimplePrime()中一个相当值得注意的错误?我只关注了Lockbox 2.07。 Lockbox 3是完全重写的,所以它不会有这些错误。