2017-08-28 205 views
1

有人可以告訴我爲什麼我收到此錯誤消息嗎?顯然,這是某種形式的轉換,我很想念16Android/Java:IV用於加密轉換。預期IV長度爲16但是是24

預期IV的長度,但在24

要調用它,我用

String encrypted = "E5ADDEB05D9D7B3925B7DE16B560D87C"; 
String sKey = "3985661DD71D591665BD39476636486B"; 
String sIv = "75E5FBB56AA78D05D246078A782553E1"; 
String decrypted = decrypt2(encrypted, sKey, sIv); 
Log.i("--------------------------------> ", decrypted); 

這是程序

public static String decrypt2(final String EncryptedMessageBase64, 
           final String symKeyHex, 
           final String sIvHex) { 

    final byte[] symKeyData = Base64.decode((symKeyHex),Base64.DEFAULT); 
    final byte[] byIvData = Base64.decode((sIvHex), Base64.DEFAULT); 
    final byte[] EncryptedMessage = Base64.decode(EncryptedMessageBase64, Base64.DEFAULT); 

    try 
    { 

     final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     final int blockSize = cipher.getBlockSize(); 

     final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); 
     Log.i("### iv size -------->", String.valueOf(blockSize)); 
     Log.i("### symKeyHex -------->", symKeyHex); 
     Log.i("### sIvHex -------->", sIvHex); 
     Log.i("### blockSize -------->", String.valueOf(blockSize)); 

     final IvParameterSpec iv = new IvParameterSpec(byIvData); 

     final byte[] encryptedMessage = new byte[EncryptedMessage.length]; 

     cipher.init(Cipher.DECRYPT_MODE, symKey, iv); 

這是輸出

### iv size -------->: 16 
### symKeyHex -------->: 3985661DD71D591665BD39476636486B 
### sIvHex -------->: 75E5FBB56AA78D05D246078A782553E1 
### blockSize -------->: 16 
error: expected IV length of 16 but was 24 
+0

也許這個相關:https://stackoverflow.com/questions/27351197/aes-256-bit-encryption-java-security-invalidalgorithmparameterexception-wrong –

回答

1

您正在對密鑰和IV進行Base64解碼,但它們是十六進制編碼的,您需要執行十六進制解碼爲二進制。

symKeyHexsIvHex非常清楚的十六進制編碼值和EncryptedMessageBase64顯然是Base64編碼。

根據已包含在你的項目一個可能性是庫:

final byte[] symKeyData = (byte[]) new Hex().decode(symKeyHex); 
final byte[] byIvData = (byte[]) new Hex().decode(sIvHex); 

更多:Base64編碼代表3個二進制字節爲4個ASCII字符。十六進制編碼表示1個二進制字節爲2個ASCII字符。

+0

謝謝你,我的好朋友! – flashc5

+0

你也可以告訴我,如果這是AES 256位?我應該這樣做,但是你讓我現在想到它實際上是一個16char密鑰 – flashc5

+1

我認爲它是一個完全安全的128位(16字節,非char)密鑰。 – zaph

相關問題