簡體   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