2011-10-14 7 views
1

RSA 암호화 후 16 진수 문자열이 있습니다. 내가 바이트 []로 변환 할 때, RSA 암호 해독 javax.crypto.BadPaddingException을 제공합니다 Blocktype 불일치 : 나는 변환이 방법을 사용하고 0RSA 암호 해독을 위해 16 진수 문자열을 바이트 배열로 변환

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

전환이 좋아 보인다 : 당신은 for 루프에서 2 i를 증가하고 데이터를 액세스 할 때 [i][i+1]를 사용하는 것이 더 낫다. 나는 네 실수가 어딘가에 있다고 생각해. (그런데, "Stack Overflow 자체에서 얻었습니다"대신 적절한 질문/답변에 링크하는 것이 적절한 방법입니다.) –

+0

코드의 관련 암호 해독 섹션을 게시 할 수 있습니까? 아마도 당신은이 루틴 대신에'String.getBytes()'를 사용하고 있습니까? – maerics

답변

1

암호화 방법을 사용하려면 입력 길이가 고정 길이 여야합니다. 이 예외를 피하기 위해 필수 길이에 패딩을 추가해야합니다. 이 크기는 키 크기에 따라 다릅니다.

수정 : data의 반복에 잠재적 인 버그가 있습니다. 길이가 2로 나눌 수없는 경우 두 번째 i++IndexOutOfBoundsException이됩니다.

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

이것은 사실입니다. 그러나 일반적으로 암호를 인스턴스화하면 기본적으로 패딩 된 변환이 선택되므로 수동으로 매딩을 수행 할 필요가 없습니다. 하지만 그것은 전적으로 영업 코드에 달려 있습니다 ... – maerics

+0

귀하의 코드 버전은 정확히 동일한 IndexOutOfBoundsException을 제공합니다. (그것은 더 명확하다.) –

+0

@ PaŭloEbermann : 잘한다. 나는 그것을 바로 잡을 것이다. – trojanfoe

관련 문제