我已经在Java中实现了AES密钥调度,但有一点我很困惑。在维基百科(http://en.wikipedia.org/wiki/Rijndael_key_schedule#Key_schedule_description)中,它说:
扩展密钥的前n个字节只是加密密钥。
这个“加密密钥”来自哪里?它是随机生成的,如果是这样的话,你应该用它来生成什么约束?
目前我有一个方法只生成一个16字节的随机数组:
public int[][] initvec() {
int[][] key = new int[4][Nk];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < Nk; j++) {
key[i][j] = mrnd.nextInt(255) % (0xff + 1);
int keyval = key[i][j];
// System.out.printf("%x,",keyval);
}
// System.out.println("");
}
return key;
}
我还想打印这个密钥,但是因为我只使用了一个大于127的数字(当前为255),所以java只有签名字节我会得到负数,这些数字不能用字符串正确表示其中outputbyte是byte []并且将整数转换为字节并存储在其中:
String output = new String(outputbyte, StandardCharsets.UTF_8);
使用127代替吗?
答案 0 :(得分:2)
这个&#34;加密密钥&#34;来自?
当需要加密某些内容时,用户提供的密钥。
它是随机生成的,如果是这样,你应该用什么约束生成它?
它可能是随机生成的。那么挑战就是告诉对方。例如,然后可以发送通过公钥加密加密的密钥。这称为hybrid encryption.
通常使用诸如Diffie-Hellman之类的密钥交换协议来协商秘密,而不通过线路完全组装。这实现了前瞻性保密,因为每一方都会自己计算密钥。
使用127代替吗?
不,不是,因为你做错了。字节0x00到0x1F不是可打印字符。因此,当您尝试打印这些字节时,即使缩减的字节域最多为127,您也不会看到实际的密钥。此外,通过限制域名,您还可以帮助攻击者,因为现在他们不需要为密钥的每个字节强制执行整个域。