我正在尝试在 aes 算法中打印密钥。但打印的密钥大小不是 128 位
i am trying to print the secret key in aes algo. but the key size printed is not 128 bits
打印密钥
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位。
你的问题和代码有 2 个问题。
首先:您询问的是 128 位 AES 密钥,但密钥生成器的参数是“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=
下面是完整的代码,运行我的在线编译器的例子:https://repl.it/@javacrypto/SoGenerateAesKey#Main.java
import java.security.*;
import javax.crypto.KeyGenerator;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import java.util.Base64;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("Generate a 256 bit = 32 byte long AES key");
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey secretKey = keyGenerator.generateKey();
System.out.println("secretKey: " + secretKey);
// the key is a 32 bytes long byte array
byte[] aesKey = secretKey.getEncoded();
System.out.println("aesKey length: " + aesKey.length);
System.out.println("aesKey:" + aesKey);
// convert to a base64 encoded String
String aesKeyBase64 = Base64.getEncoder().encodeToString(aesKey);
System.out.println("aesKeyBase64: " + aesKeyBase64);
}
}
编辑:
要从 Base64 编码的字符串中取回密钥,请使用这行代码:
SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode("base64string"), "AES");
并将其用作 cipher.init:
的输入
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
打印密钥
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位。
你的问题和代码有 2 个问题。
首先:您询问的是 128 位 AES 密钥,但密钥生成器的参数是“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=
下面是完整的代码,运行我的在线编译器的例子:https://repl.it/@javacrypto/SoGenerateAesKey#Main.java
import java.security.*;
import javax.crypto.KeyGenerator;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import java.util.Base64;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("Generate a 256 bit = 32 byte long AES key");
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey secretKey = keyGenerator.generateKey();
System.out.println("secretKey: " + secretKey);
// the key is a 32 bytes long byte array
byte[] aesKey = secretKey.getEncoded();
System.out.println("aesKey length: " + aesKey.length);
System.out.println("aesKey:" + aesKey);
// convert to a base64 encoded String
String aesKeyBase64 = Base64.getEncoder().encodeToString(aesKey);
System.out.println("aesKeyBase64: " + aesKeyBase64);
}
}
编辑:
要从 Base64 编码的字符串中取回密钥,请使用这行代码:
SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode("base64string"), "AES");
并将其用作 cipher.init:
的输入cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);