+-
需要使用bouncycastle将AES 256密钥“扩展”为Java中的10个圆形密钥
我试图在 Java中实现Cryptonight算法(不使用JNI包装器).早期的步骤之一是将AES 256位密钥“扩展”为10个圆形密钥.我似乎无法理解此处的术语.我猜我不需要从头开始实现这种扩展,因为bouncycastle似乎已经实现了AES.但是我无法在他们的代码中或通过google找到专门说明“扩展”及其操作方式的操作.我如何才能做到这一点,理想情况下,只需简单地调用bouncycastle API的一部分即可.

尽管我很欣赏所有细节,但我不一定要学习密码学,而是尽可能地尝试了解如何使用现有库来完成此任务,但在必要时愿意手动进行.

最佳答案
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(这是循环的上限).但这是硬编码的.对于其他密钥长度,在包含循环(上限为轮数)的开关情况下,也以相同的方式对其进行硬编码.

因此,对于您的Cryptonight实现,其密钥长度为256位,但经过10次回合,BouncyCastle实现中的硬编码值不符合您的需求.

因此,您需要派生BouncyCastle并修改此代码以实现您的目标.

点击查看更多相关文章

转载注明原文:需要使用bouncycastle将AES 256密钥“扩展”为Java中的10个圆形密钥 - 乐贴网