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