2016-03-07 218 views
-1

的前10個字符生成密鑰比方說,我有一個Base64編碼字符串:從Base64編碼字符串

data = AOUTl5C2QV2xFRPlzKR0Ag== 

我想生成該Base64編碼字符串的前10個字符中的Java(Android版)密鑰然後將其用於AES解密從服務器發送的消息。要做到這一點,我用下面的代碼:

String firstTen = data.substring(0, 10); 
byte[] decodedBytes = Base64.decode(firstTen, Base64.DEFAULT); 
SecretKeySpec key = new SecretKeySpec(decodedBytes, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.DECRYPT_MODE, key); 
byte[] original = cipher.doFinal(Message_to_Decrypt, Base64.DEFAULT)); 

但我可以一Java.security.Exception:

java.security.InvalidKeyException: Key length not 128/192/256 bits. 

有沒有一種方法,我可以得到一個有效的密鑰,我可以使用從Base64String的前10個字符進行AES解密?

+0

Base64是什麼類?在java.util.Base64或org.apache.commons.codec.binary.Base64中沒有Base64.DEFAULT。 – gfelisberto

+0

我在Android中執行此操作 – Gravity

+0

developer.android.com/reference/android/util/Base64.html – Gravity

回答

1

用散列函數或更好的PBKDF2(基於密碼的密鑰推導函數2)擴展10個字符。

您確實需要提供預期長度的密鑰,AES密鑰長度可以是128,192或256個字節。雖然某些AED實現可能無效,但密鑰不依賴於此,它不是標準的一部分。

+0

謝謝我會研究一下 – Gravity

+0

其實你可能會指出一個PBKDF2的例子嗎? – Gravity

+1

Google「Java PBKDF2」。 PBKDF1 [文檔](https://en.wikipedia.org/wiki/PBKDF2)。 – zaph

1

錯誤消息說:密鑰長度不是128/192/256位。

您正在使用10個字符,每個字符都是8位。所以10 * 8 = 80。試用16個字符(128/8 = 16)。

+0

但我沒有16個字符,是否有一個參數可以通過,以便它會自動擴展到16個字符,我被告知只需要使用前10個字符 – Gravity

+2

您試圖解密某些已經加密,所以你不能爲密鑰制定規則。如果他們在填充密鑰或其他內容,您可能需要檢查誰在進行加密。 – gfelisberto