java - ccrypt不会解密ccrypt-j加密的文件

标签 java encryption bouncycastle rijndael

我一直在尝试修复 ccrypt-j ,Linux 的纯 Java 实现 ccrypt命令。我发现初始化 vector (IV) 存在一些问题,这使得 ccrypt 除了其自身的输出之外无法解密任何内容。

我修改了两个库,以便始终将相同的随机数提供给 Rijndael 引擎的两个实现,但是,实现之间的输出 IV 始终不同,即两个库始终具有相同的结果(因为 Rijndael 是确定性的),但这些结果始终不同。

我知道问题只是 ccrypt 生成 IV 的方式,因为:

  1. ccrypt-j-加密可以从ccrypt-j解密
  2. 如果我用 ccrypt 加密文件的 IV 替换 IV(加密文件的前 32 个字节),ccrypt 将很好地解密它。

Ccrypt 使用自己的用 C 语言编码的 Rijndael 实现,而 ccrypt-j 使用 Bouncy CaSTLe 的实现。

编辑:2016 年 4 月 1 日

因为 IV 是在任何数据加密之前构建的(实际上,甚至读取任何数据),我相信问题必须出在 Bouncy CaSTLe 和 ccrypt 自己的实现中 Rjindael 的初始化方式上。我将尝试在两个实现中执行相同的顺序,看看会得到什么。

最佳答案

一个半答案

如果你看看旧的ccrypt,有一些关于IV的解释。如果我继续,4个字节是固定的——魔数(Magic Number)——,它暂时是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

In ccrypt, the seed is constructed as follows: first, a nonce is contructed by hashing a combination of the host name, current time, process id, and an internal counter into a 28-byte value, using a cryptographic hash function. The nonce is combined with a fixed four-byte "magic number", and the resulting 32-byte value is encrypted by one round of the Rijndael block cipher with the given key. This encrypted block is used as the seed and appended to the beginning of the ciphertext. The use of the magic number allows ccrypt to detect non-matching keys before decryption.

神奇数字:http://ccrypt.sourcearchive.com/documentation/1.7-7/ccryptlib_8c-source.html

似乎魔数(Magic Number)没有改变(从 1.1 到 1.10 一样,之前我不知道)。

那又怎样?

ccrypt 旨在与先前版本(emacs 等)兼容。它可以加密和解密,应用广泛。

那么问题来自于ccrypt-j。

在 sourceforge 上可以看到两件重要的事情:

1 兼容性

Encrypting a file using ccrypt-j

TODO

Decrypting a file using ccrypt-j

TODO

那么什么才是真正有效的呢?

2 事实上,它使用了 bouncy caSTLe,它使用得很好,并且确实很好地实现了标准。

所以结论?

你不能指望 ccrypt 会改变。

然后:可以通过ccrypt-j解密ccrypt

但如果想用ccrypt解密,就得限制ccrypt-j

我对你的说法表示怀疑,因为这太神奇了!

If I substitute the IV (first 32 bytes of the encrypted files) with that of a ccrypt-encrypted file, ccrypt will decrypt it just fine.

但如果它有效,为什么不使用它呢? (ccrypt-j也能解密?)

最后建议:联系 ccrypt-j 支持

希望对你有帮助

关于java - ccrypt不会解密ccrypt-j加密的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34355450/

相关文章:

java - 在 IntelliJ Idea 中将常量导入替换为静态导入

java - Arrays.toString() 是否覆盖了 Object 的 toString() 方法?

mysql - Openfire 使用 MySQL ENCRYPT

ruby - 模仿 Ruby 中的 AES_ENCRYPT 和 AES_DECRYPT 函数

java - Apache POI OPCPackage 无法保存 Jasper 报告生成的 XLSX

java - 未使用 goDaddy 证书验证 HTTPS 主机名

java - IE11和Safari没有将授权 header 传递给后端

java - java中如何维护session

java - 创建 PKCS#10 CSR 和 HMAC 印章

java - Android:生成椭圆曲线KeypPair