0

我直接使用了 BouncyCastle 的 Threefish,而不是通过安全 API。

byte[] key = new byte[1024];
...
byte[] tweak = new byte[16];
...
ThreefishEngine threefishEngine = new ThreefishEngine(1024);
threefishEngine.init(true, new TweakableBlockCipherParameters(new KeyParameter(key), tweak));
...
threefishEngine.processBlock(...);

有趣的是,相同的块将以相同的方式加密。我预计前一个块的结果会影响下一个块的结果(因为密钥调度会产生永久不同的密钥),并且相同的块将以不同的方式加密。

在 BouncyCastle 的源代码 ThreefishEngine.java 中,tweak 用于方法 encryptBlock 中的加密,但tweak 永远不会改变。同样对于下一个块的加密,不使用前一个块,既不是原始未加密块也不是加密块。在 ThreefishEngine 中,在 ThreefishEngine 初始化后,没有任何方法可以更改调整。ThreefishEngine 中的密钥调度仅在单个块内完成,对下一个块的加密没有影响。

以下是问题。

1. 是否正确,相同的块产生相同的加密块?我的期望是错误的吗,相同的块应该以不同的方式加密?实际上,这是块密码和流密码之间的本质区别,否则就是流密码。

2. 是否只对一个区块进行密钥调度(不同的密钥应用于区块的不同部分)?每个块的键调度是否相同?这可以解释为什么加密块是相等的。

4

0 回答 0