2011-10-14 70 views
1

RSA加密後我有一個十六進制字符串。當我將其轉換爲一個byte [],RSA的解密給javax.crypto.BadPaddingException:Blocktype不匹配:0將十六進制字符串轉換爲字節數組用於RSA解密

我使用轉換這種方法(有它的堆棧溢出本身)

public static byte[] hexStringToByteArray(String data) { 
    int k = 0; 
    byte[] results = new byte[data.length()/2]; 
    for (int i = 0; i < data.length();) { 
     results[k] = (byte) (Character.digit(data.charAt(i++), 16) << 4); 
     results[k] += (byte) (Character.digit(data.charAt(i++), 16)); 
     k++; 
    } 
    return results; 
} 

任何建議請。

+1

您的轉換看起來不錯。我想你的錯誤是在別的地方。 (順便說一下,不是「通過堆棧溢出本身獲取它」,正確的方法是鏈接到相關的問題/答案。) –

+0

您能否發佈代碼的相關解密部分?也許你在某處使用'String.getBytes()'而不是這個例程? – maerics

回答

1

加密方法要求輸入是固定長度;你將不得不添加填充到所需的長度,以避免這種例外。這個大小將取決於密鑰大小。

編輯:在你的迭代data也有一個潛在的錯誤:如果它的長度不能被2整除然後第二個i++將導致IndexOutOfBoundsException。您是關中for環路由2遞增i和訪問數據時使用[i][i+1]更好:

for (int i = 0; i + 1 < data.length(); i += 2, k++) 
{ 
    results[k] = (byte) (Character.digit(data.charAt(i), 16) << 4); 
    results[k] += (byte) (Character.digit(data.charAt(i + 1), 16)); 
} 
+0

這是真的;但是,通常當您實例化密碼時,默認情況下它將選擇填充轉換,因此不需要手動玩弄瘋狂。但它完全取決於OP代碼... – maerics

+0

您的代碼版本會給出與IndexOutOfBoundsException完全相同的代碼。 (儘管如此,這更清楚。) –

+0

@PaŭloEbermann:好的。我會糾正它。 – trojanfoe

相關問題