需要"扩展" AES 256使用bouncycastle键入Java中的10个圆键

时间:2017-08-31 13:20:08

标签: java encryption aes bouncycastle

我试图在java中实现Cryptonight算法(不使用JNI包装器)。其中一个早期步骤是扩展"一个AES 256位密钥到10个圆键。我似乎无法理解这里的术语。我猜我不需要从头开始实现扩展,因为AES似乎已经由bouncycastle实现了。但是,我无法在他们的代码中或通过谷歌找到一个具体说明"扩展"以及如何做到这一点。我怎样才能实现这一点,最好只需要调用bouncycastle API的一部分。

我不一定会尝试学习加密技术,虽然我很欣赏任何细节,但是如果可能的话,我更愿意了解如何使用现有的库来完成这项任务,但是如果有必要,我愿意手动完成。

2 个答案:

答案 0 :(得分:5)

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)

读取此代码,很容易看出,如果密钥长度为128位,则keyLen值为16(字节),因此KC为4,则ROUNDS为10(这是循环的上限)。但它硬编码。对于其他密钥长度,它也以相同的方式硬编码,在switch case中包含一个循环,其上限是轮数。

因此,对于Cryptonight实现,密钥长度为256位但有10轮,BouncyCastle实现中的硬编码值与您的需求不符。

因此,您需要分叉BouncyCastle并修改此代码以实现目标。

答案 1 :(得分:-1)

对于CryptoNight修改的AES,您只需要从256位输入密钥生成10个循环密钥。您可以使用标准AES密钥扩展,仅使用前10个密钥。 这是我的Java代码示例文章,描述了针对AES密钥计划的CryptoNight: http://cryptoexplained.tech/hash-algorithms/aes-key-schedule