繁体   English   中英

如何从AES-256切换到AES-128?

[英]How to switch from AES-256 to AES-128?

关于AES有很多问题,但是我有以下问题。 我目前正在使用以下AES实现来加密数据

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);

事实证明,结果是32字节(256位)。 所以我正在使用AES-256。 这个实现对我来说太慢了。 如何切换到AES-128? 我不需要任何填充或操作模式或键哈希。

先感谢您。

您已经在使用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模式具有相同的明文值将产生相同的密文值的属性。 这在密码系统中是很少需要的。

这里 ,有关堆栈溢出的问题也被问到了类似的问题,它将帮助您提供所需的信息。 重要的一点是, 《 JCA参考指南 》指出:

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

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

此外, 密码类定义的转换“AES / ECB / NoPadding”,将让你的非填充16字节的值encryptedData ECB是AES的默认模式,您也可以选择“ AES / CBC / NoPadding”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM