Java 我正在用aes算法打印密钥。但打印的密钥大小不是128位

Java 我正在用aes算法打印密钥。但打印的密钥大小不是128位,java,encryption,aes,Java,Encryption,Aes,打印密钥 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); cipher = Cipher.getInstance("AES"); String plainText = "AES Symmetric Encryption Decr

打印密钥

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
cipher = Cipher.getInstance("AES");
String plainText = "AES Symmetric Encryption Decryption";
System.out.println("Plain Text Before Encryption: " + plainText);

String encryptedText = encrypt(plainText, secretKey);
System.out.println("Encrypted Text After Encryption: " + encryptedText);

String decryptedText = decrypt(encryptedText, secretKey);
System.out.println("Decrypted Text After Decryption: " + decryptedText);
System.out.println("srecretkey"+secretKey);
我得到的结果是:

Plain Text Before Encryption: AES Symmetric Encryption Decryption
Encrypted Text After Encryption: l4YZj1SjqS/vr1mK9K4LC7lBFfQ4wkJg2zIlb81ghpkM5qnvCyyfMeYop2ppHDoX
Decrypted Text After Decryption: AES Symmetric Encryption Decryption
srecretkeyjavax.crypto.spec.SecretKeySpec@15300

这里的密钥大小不是128位。

您的问题和代码有两个问题

第一:您询问的是128位AES密钥,但keygenerator的参数为“256”,这意味着您生成了256位(=32字节)长的AES密钥:

keyGenerator.init(256);
第二:AES密钥是字节数组中的随机数据,不适合打印为字符串。当您需要密钥的打印输出时,有几种方法可以-我向您展示一种将密钥编码为(Base64)编码字符串的方法:

String aesKeyBase64 = Base64.getEncoder().encodeToString(aesKey);
这是示例程序的输出:

Generate a 256 bit = 32 byte long AES key
secretKey: javax.crypto.spec.SecretKeySpec@1518c
aesKey length: 32
aesKey:[B@6d9c638
aesKeyBase64: cWEo4+jv0SXBgbiZbdiouasFYuV3rUYKQ3403y4wU14=
下面是完整的代码,请使用我的联机编译器运行该示例:

编辑:

要从Base64编码字符串获取密钥,请使用以下代码行:

SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode("base64string"), "AES");
并将其用作cipher.init的输入:

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

“这里的密钥大小不是128位”-您是否假设“javax.crypto.spec”。SecretKeySpec@15300“是实际的密钥数据吗?不是。这只是
Object.toString()
的默认输出,如果它没有被覆盖的话。我认为没有理由认为基于您的输出,密钥的大小不是128位。返回原始密钥数据(如
字节[]
),但此数据的大小为32字节(=256位),由于此大小是在中指定的。那么我如何打印实际密钥?但此处打印的aes密钥不是32个字符。请您澄清,打印的aesKey的长度应为256个字符。其aesAn aes密钥与“字符”无关,而是与字节或更好的32字节长字节数组有关。AES密钥应该是随机的,因此它将包含大量不可打印为字符的字节,相反,您可以使用十六进制字符串输出(将是64个“字符”,只要每个字节用2个“字符”表示),或者-通常更有用-作为Base64编码字符串。只需对Base64字符串进行解码即可获得32字节长的字节数组,或者直接使用“aesKey”中的键(我使用base64编码表单获得打印输出。谢谢你的帮助。我的程序终于开始工作了。我很高兴看到你的程序正在工作。如果我的回答有帮助,请将其标记为接受,谢谢。我还有一个问题。我如何才能将aesKey恢复为原始格式。因为密钥的数据类型是int
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);