1

我已经在 J​​ava 中实现了 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 是否可以接受?

4

1 回答 1

2

这个“加密密钥”从何而来?

它是用户在需要加密某些内容时提供的密钥。

它是随机生成的,如果是的话,你应该用什么约束来生成它?

它可能是随机生成的。那么挑战就是让对方知道。例如,然后可以发送通过公钥加密加密的密钥。这称为混合加密。

通常使用诸如 Diffie-Hellman 之类的密钥交换协议来协商秘密,而无需通过线路完全组装发送。这实现了前向保密,因为每一方都将自己计算密钥。

使用 127 是否可以接受?

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

在生成随机密钥时,您需要利用密钥字节的全部容量。然后,当您想查看密钥时,可以使用Base 64Hex对其进行编码。

于 2015-03-21T09:15:48.853 回答