我已经在 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 是否可以接受?