The*_*ner 3 java encryption bouncycastle aes
我试图在java中实现Cryptonight算法(不使用JNI包装器).其中一个早期步骤是将AES 256位密钥"扩展"为10个循环密钥.我似乎无法理解这里的术语.我猜我不需要从头开始实现扩展,因为AES似乎已经由bouncycastle实现了.但我无法在他们的代码中找到一个操作,或者通过谷歌专门谈到"扩展"以及如何做到这一点.我怎样才能实现这一点,理想情况下只需调用bouncycastle API的一部分即可.
我不一定试图学习密码术,虽然我很欣赏任何细节,但是如果可能的话,我更愿意理解如何使用现有的库来完成这项任务,但是如果有必要,我愿意手动完成.
AES-128使用10轮,AES-192使用12轮,AES-256使用14轮.
使用BouncyCastle,它在类org.bouncycastle.crypto.engines.AESEngine中实现,名为private方法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)
Run Code Online (Sandbox Code Playgroud)
读取此代码,很容易看出,如果密钥长度为128位,则keyLen值为16(字节),因此KC为4,则ROUNDS为10(这是循环的上限).但它是硬编码的.对于其他密钥长度,它也以相同的方式硬编码switch case,包含一个循环,其上限是轮数.
因此,对于Cryptonight实现,密钥长度为256位但有10轮,BouncyCastle实现中的硬编码值与您的需求不匹配.
因此,您需要分叉BouncyCastle并修改此代码以实现您的目标.