无效的 AES 密钥长度错误

Posted

技术标签:

【中文标题】无效的 AES 密钥长度错误【英文标题】:invalid AES key length error 【发布时间】:2010-12-18 03:53:31 【问题描述】:

此代码给出了。我该如何纠正? (我想要 128 位密钥 AES 加密)

package org.temp2.cod1;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

public class Code1 

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException 
    String s = "9882623867";
    byte[] plaintext = s.getBytes("UTF-16");
    String s2 = "supernova";
    byte[] key = s2.getBytes("UTF-16");
    Cipher c = Cipher.getInstance("AES");
    SecretKeySpec k =  new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    byte[] encryptedData = c.doFinal(plaintext);
    System.out.println(encryptedData);


任何帮助表示赞赏

【问题讨论】:

【参考方案1】:

使用 16 字节的键值字符串进行平滑加密,例如密钥“thebestsecretkey”将在 base64 上工作

【讨论】:

【参考方案2】:

使用 SecretKeyFactory 从密码中派生密钥字节。您可以查看详细示例 here. 请注意,您需要指定 128 位的密钥长度,而不是该示例中所示的 256 位。

您将遇到的下一个问题是您没有指定填充方案。除非您的消息是 16 字节(AES 块大小)的倍数,否则将引发错误。如示例所示使用 PKCS5Padding。

在密码上使用 CBC 模式将需要为每条消息选择一个新的初始化向量。这个唯一的 IV 必须与加密的消息一起发送给收件人。

在没有彻底理解这里提出的概念(以及更多概念)的情况下尝试执行加密可能会导致系统不安全。

【讨论】:

【参考方案3】:

对于像 AES 这样的分组密码,您通常不能使用任意长度的密钥(例如您在此处使用“supernova”)。您必须使用适合您选择的算法的受支持密钥长度(128、192、256 等)。

执行此操作的一种常见方法是散列您的密码(例如,通过 SHA)并提取前 N 个字节。无论如何,这更好,因为它允许您使用初始化值“加盐”您的密码,这样即使他们的密码相同,也没有两个用户的“密钥”是相同的。如果你真的对这些东西感兴趣,那么开创性的工作是Applied Cryptography by Bruce Schneier。

具体实现细节,see

【讨论】:

【参考方案4】:

当您尝试使用的密钥长度不正确时,您可能会收到此错误。

所以在伪代码中,你正在尝试这样的事情:

String key = "123";
SecretKeySpec k =  new SecretKeySpec(key, "AES");

但是密钥太短了 - 它需要像 31 个字符一样长。

所以检查你的键值 -> 它可能存储在某个地方不正确。

【讨论】:

以上是关于无效的 AES 密钥长度错误的主要内容,如果未能解决你的问题,请参考以下文章

[转]AES加密遇到的问题

AES

AES加密算法256位密钥与128位密钥的不同是啥?

Java 环境下使用 AES 加密的特殊问题处理

text 唯一支持的密码是AES-128-CBC和AES-256-CBC,密钥长度正确。

AES算法简介