我在哪里获得AES密钥计划加密密钥?

时间:2015-03-20 23:28:40

标签: java aes schedule rijndael symmetric-key

我已经在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代替吗?

1 个答案:

答案 0 :(得分:2)

  

这个&#34;加密密钥&#34;来自?

当需要加密某些内容时,用户提供的密钥。

  

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

它可能是随机生成的。那么挑战就是告诉对方。例如,然后可以发送通过公钥加密加密的密钥。这称为hybrid encryption.

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

  

使用127代替吗?

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

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