0

There were many questions about AES, but I have the following problem. I'm currently using the following AES implementation to encrypt data

byte [] PRFkey = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
byte [] plaintext = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

SecretKeySpec encryptionKey=new SecretKeySpec(PRFkey, "AES");
Cipher cipher=Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
byte[] encryptedData=cipher.doFinal(plaintext);

And it turned out that result is 32-bytes (256 bits). So I'm using AES-256. This implementation is to slow for me. How can I switch to AES-128? I don't need any padding or mode of operation or key hashing.

Thank you in advance.

4

2 回答 2

3

您已经在使用 128 位 AES。这取决于您传递给 的密钥的长度,Cipher.init()在您的示例中为 16 个字节(128 位)。

您的输出大小将取决于您的填充模式(以及输入数据的大小)。由于您忽略了指定操作模式或填充,您的 JCE 提供程序可能默认为"AES/ECB/PKCS5Padding". PKCS #5 填充总是会在输出大小上增加一个块,因此您收到的输出是 32 字节而不是 16 字节。

永远不要让您的提供商为您选择默认值。相反,明确指定模式和填充:

Cipher cipher=Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
byte[] encryptedData=cipher.doFinal(plaintext);  // will be 16 bytes

请记住,如果您指定不填充,您的输入数据必须始终是 16 字节的精确倍数。另请注意,ECB 模式具有相同的明文值将产生相同的密文值的属性。这在密码系统中很少需要。

于 2013-09-28T08:35:09.923 回答
1

一个类似的问题被问到堆栈溢出here,它将帮助您提供您正在寻找的信息。重要的一点是JCA 参考指南说:

(创建密码对象)如果未指定模式或填充,则使用模式和填充方案的特定于提供者的默认值。例如,SunJCE 提供程序使用 ECB 作为默认模式,PKCS5Padding 作为 DES、DES-EDE 和 Blowfish 密码的默认填充方案。这意味着在 SunJCE 提供程序的情况下: Cipher.getInstance("DES") 和 Cipher.getInstance("DES/ECB/PKCS5Padding") 是等效的语句。

因此,由于您仅将“AES”指定为转换,因此 Oracle JDK 7 的 AES 的默认密码是“AES/ECB/PKCS5Padding”,链接

此外,Cip ​​her 类定义了转换“AES/ECB/NoPadding”,它将为您的encryptedData. ECB 是 AES 的默认模式,您也可以选择“AES/CBC/NoPadding”。

于 2013-09-28T02:37:21.513 回答