[英]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.