我一直在尝试修复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支持

希望能帮助到你

10-07 23:27