我从哪里获得 AES Key Schedule 加密密钥?

Where do I get AES Key Schedule encryption key?

我已经在 Java 中实施了 AES 密钥计划,但有一件事让我感到困惑。在维基百科 (http://en.wikipedia.org/wiki/Rijndael_key_schedule#Key_schedule_description) 中它说:

The first n bytes of the expanded key are simply the encryption key.

这个"encryption key"从哪里来的?它是随机生成的吗?如果是,您应该使用哪些约束来生成它?

目前我有一个方法可以生成一个 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;
}

我也想打印这个密钥,但是因为 java 只有带符号的字节,如果我使用大于 127(当前为 255)的数字,我将得到负数,不能用正确使用类似这样的字符串,其中 outputbyte 是 byte[] 并将整数转换为字节并存储在其中:

String output = new String(outputbyte, StandardCharsets.UTF_8);

使用 127 可以吗?

Where does this "encryption key" come from?

这是用户在需要加密时提供的密钥。

Is it generated randomly and if so what constraints you should generate it with etc?

可能是随机生成的。那么挑战就是让对方知道。例如,可以发送通过 public-key crypto 加密的密钥。这叫做hybrid encryption.

通常使用 Diffie-Hellman 等密钥交换协议来协商秘密,而无需通过网络将其完全组装发送。这样就实现了前向保密,因为每一方都会自己计算秘钥。

Is using 127 instead acceptable?

不,不是,因为你做错了整件事。字节 0x00 到 0x1F 不是可打印字符。因此,当您尝试打印这些字节时,即使使用最多 127 个减少的字节域,您也看不到实际的密钥。此外,通过限制域,您还可以帮助攻击者,因为现在他们不需要为密钥的每个字节强制执行完整的域。

生成随机密钥时需要利用密钥字节的全部容量。当您想要查看密钥时,可以使用 Base 64 or Hex.

对其进行编码