我一直在尝试修复ccrypt-j
,这是linux ccrypt
命令的纯Java实现。我发现初始化向量(IV)存在一些问题,该问题使ccrypt
不能解密任何东西,只能解密自己的输出。
我修改了这两个库,以使相同的随机数始终馈送给Rijndael引擎的两个实现,但是,输出IV在实现之间总是不同的,即,两个库始终具有相同的结果(因为Rijndael是确定性的),但是这些结果是总是不同的。
我知道问题只是ccrypt
生成IV的方式,因为:
可以从ccrypt-j
解密ccrypt-j-encrypted
如果将IV(加密文件的前32个字节)替换为ccrypt加密文件的IV,ccrypt
会对其进行解密。
Ccrypt使用自己的用C编码的Rijndael实现,而ccrypt-j使用Bouncy Castle的实现。
编辑:04/01/2016
因为IV是在加密任何数据(实际上甚至是读取任何数据)之前构造的,所以我认为问题必须出在Bouncy Castle和ccrypt
自己的实现中初始化Rjindael的方式上。我将尝试在两个实现中执行相同的顺序,然后看看能得到什么。
最佳答案
一半答案
如果您查看旧的ccrypt,则有一些有关IV的解释。如果我恢复,4个字节是固定的-幻数-si c051一段时间。还讨论了有关证券的问题:
幻数:看到
http://ccrypt.sourceforge.net/faq.html
ccrypt来自emacs / jka-compr:
http://www.opensource.apple.com/source/emacs/emacs-51/emacs/lisp/jka-compr.el
在ccrypt中,种子的构造如下:首先,随机数为
通过对主机名,当前时间,
进程ID,以及一个内部计数器,其值为28字节,使用
加密哈希函数。随机数与固定
四字节的“幻数”,然后将所得的32字节值加密
用给定密钥对Rijndael分组密码进行一轮加密。这个
加密的块用作种子,并附加到
密文。魔术数字的使用允许ccrypt检测
解密前使用不匹配的密钥。
那里的幻数:http://ccrypt.sourcearchive.com/documentation/1.7-7/ccryptlib_8c-source.html
魔术数字似乎没有变化(从1.1到1.10,我不知道)。
所以呢 ?
ccrypt旨在与先前版本(emacs,...)兼容。它可以加密和解密,并且被广泛使用。
然后问题来自ccrypt-j。
在sourceforge上看到的是2件重要的事情:
1兼容性
使用ccrypt-j加密文件
去做
使用ccrypt-j解密文件
去做
那么什么真正起作用?
2实际上,它使用了有弹性的城堡,该城堡使用得很好,并且可以很好地实现标准。
那么结论呢?
您不能希望ccrypt会改变。
然后:您可以通过ccrypt-j解密ccrypt
但是如果要通过ccrypt解密,则必须限制ccrypt-j
我怀疑您的主张,因为这太神奇了!
如果我将IV(加密文件的前32个字节)替换为
如果是ccrypt加密文件的文件,则ccrypt会将其解密就可以了。
但是,如果可行,为什么不使用它呢? (ccrypt -j还可以解密吗?)
最后建议:联系ccrypt-j支持
希望能帮助到你