我正在尝试在 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);