需要";扩大;使用bouncycastle在Java中将AES 256键转换为10个圆键

需要";扩大;使用bouncycastle在Java中将AES 256键转换为10个圆键,java,encryption,aes,bouncycastle,Java,Encryption,Aes,Bouncycastle,我正在尝试用java实现Cryptonight算法(不使用JNI包装器)。早期步骤之一是将AES 256位密钥“扩展”为10个圆密钥。我似乎不懂这里的术语。我猜我不需要从头开始实现扩展,因为AES似乎已经由bouncycastle实现了。但我在他们的代码中或通过谷歌找不到专门提到“扩展”以及如何实现的操作。理想情况下,我如何通过简单地调用BouncyCastleAPI的一部分来实现这一点 我不一定要学习密码学,尽管我很欣赏任何细节,但我更想了解如何使用现有库(如果可能)完成这项任务,但如果必要,

我正在尝试用java实现Cryptonight算法(不使用JNI包装器)。早期步骤之一是将AES 256位密钥“扩展”为10个圆密钥。我似乎不懂这里的术语。我猜我不需要从头开始实现扩展,因为AES似乎已经由bouncycastle实现了。但我在他们的代码中或通过谷歌找不到专门提到“扩展”以及如何实现的操作。理想情况下,我如何通过简单地调用BouncyCastleAPI的一部分来实现这一点


我不一定要学习密码学,尽管我很欣赏任何细节,但我更想了解如何使用现有库(如果可能)完成这项任务,但如果必要,我愿意手动完成。

AES-128使用10轮,AES-192使用12轮,AES-256使用14轮

使用BouncyCastle,它在类
org.BouncyCastle.crypto.engines.AESEngine
中,在名为
generateWorkingKey()
的私有方法中实现。这不是一个通用的实现:

该方法从以下内容开始:

[...]
int KC = keyLen >>> 2;
ROUNDS = KC + 6;  // This is not always true for the generalized Rijndael that allows larger block sizes
int[][] W = new int[ROUNDS+1][4];   // 4 words in a block
switch (KC) {
  case 4:
[...]
for (int i = 1; i <= 10; ++i)
[…]
int KC=keyLen>>>2;
轮数=KC+6;//对于允许较大块大小的通用Rijndael,这并不总是正确的
int[][]W=新int[ROUNDS+1][4];//一块四个字
开关(KC){
案例4:
[...]

对于(int i=1;i对于CryptoNight修改的AES,您只需要从256位输入密钥生成10个轮密钥。您可以使用标准AES密钥扩展,只获取前10个密钥。 下面是我的文章,其中包含Java代码示例,这些示例描述了特定于AES密钥调度的CryptoNight:

我不希望扩展在公共API中可见。它毕竟是内部工作的一部分。不过你可以试试。我已经深入研究了内部,以暴露SHA3摘要的内部状态(与最终的64字节摘要相反)。因此,如果有必要,我愿意扩展该代码。我只是不确定该去哪里查找。但是你不需要11个圆键吗?算法声明我需要10个圆键。不确定AES是否扩展到更多。希望在这里得到一些澄清。明白了。这就是我目前所做的。不过仍在测试实现。