Java 从哪里获取AES密钥计划加密密钥?

Java 从哪里获取AES密钥计划加密密钥?,java,aes,schedule,rijndael,symmetric-key,Java,Aes,Schedule,Rijndael,Symmetric Key,我已经用Java实现了AES密钥调度,但有一件事我感到困惑。在维基百科()中,它说: 扩展密钥的前n个字节只是加密密钥 这个“加密密钥”来自哪里?它是随机生成的吗?如果是,您应该使用什么约束生成它 目前我有一个方法,它只生成一个16字节的随机数组: public int[][] initvec() { int[][] key = new int[4][Nk]; for (int i = 0; i < 4; i++) { for (int j = 0; j &

我已经用Java实现了AES密钥调度,但有一件事我感到困惑。在维基百科()中,它说:

扩展密钥的前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是否可以接受

这个“加密密钥”来自哪里

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

它是随机生成的吗?如果是,您应该使用什么约束生成它

它可以随机生成。那么,挑战就是让对方知道。例如,可以通过公钥加密发送加密的密钥。这叫做

通常使用Diffie-Hellman之类的密钥交换协议来协商秘密,而无需将其完全组装在电线上发送。这实现了前向保密,因为各方将自己计算密钥

使用127是否可以接受

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


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

key[i][j]=mrnd.nextInt(255)%(0xff+1)?您在其中使用了很多255,但仍将其排除在外。它可能不再觉得被需要了。
String output = new String(outputbyte, StandardCharsets.UTF_8);