2013-12-11 2 views
1

그래서 RSA 공개 키와 개인 키를 사용하여 문자열을 암호화/해독하려고합니다. 그것은 괜찮아요,하지만 난 암호화 된 문자열을 해독하려고 할 때마다 나는 아주 이상한 출력을 얻을. 예를 들어, "hello"는 다음과 같이 암호를 해독합니다.RSA 개인 키를 사용하여 암호 해독

] t1 # Z - -p ԏh2 5 ~ E' bh ~ -I TK> + V? 아니가 [@jp! 2 픽셀 오즈 @ $ @ 5 & V = AeAm는, @d < "&}} rq5U Jc는 �Db�A�! {w | IE? 나의 algori 해독에 문제가 만약 거기에 魈 S] �'����88��%������ ��O.N:S EJ04l3Ύn3 {.

는 잘 모르겠어요 .

public String decryptString(PrivateKey key, String string) { 
    try { 

     pubDecryptCipher.init(Cipher.DECRYPT_MODE, key); 
     byte[] decodedBytes = Base64.decodeBase64(string.getBytes()); 
     byte[] unencryptedByteArray = pubDecryptCipher.doFinal(decodedBytes); 
     return new String(unencryptedByteArray, "UTF8"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

암호화 :

public String encryptString(PublicKey key, String string) { 
    try { 
     pubEncryptCipher.init(Cipher.ENCRYPT_MODE, key); 
     byte[] eba = pubEncryptCipher.doFinal(string.getBytes("UTF8")); 
     byte[] encodedBytes = Base64.encodeBase64(eba); 

     return encodedBytes.toString(); 

    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

    } 
    return null; 
} 

가 해독 된 문자열은 문자열로 해독 된 바이트 변환 (또는 그 라인을 따라 뭔가)와 함께 할

이있는 경우 THM이 나 여기에 암호 해독 방법입니다 16 진수 :

efbfbdefbfbdefbfbdc78d2defbfbd6e2fefbfbdefbfbdefbfbd50efbfbd73efbfbd6defbfbd31efbfbd40117defbfbdefbfbd2cefbfbd576ed39c2aefbfbd41533defbfbdefbfbd1a167c23efbfbdd0a11a3213355eefbfbdefbfbdefbfbd6145efbfbd55efbfbdefbfbd7d09efbfbd700814efbfbdefbfbd687b225eefbfbd3c00efbfbdefbfbd3509efbfbd6c5eefbfbdefbfbd79efbfbdefbfbd033d77efbfbd71efbfbd57efbfbd7e76d6a101efbfbd4aefbfbd4a0540efbfbdefbfbd297f6fefbfbd73efbfbdefbfbdefbfbd010defbfbdefbfbdefbfbd00efbfbd490706efbfbdefbfbdefbfbd322435efbfbd02efbfbdefbfbd1dd79477efbfbd13efbfbdd5bb57efbfbdefbfbd0aefbfbd39404b53efbfbdefbfbd06165aefbfbd32efbfbdefbfbd4665efbfbddd9d6aefbfbd0842efbfbdefbfbd7c35efbfbdefbfbdefbfbd3e7eefbfbdefbfbd11efbfbd1fc7b839efbfbd44efbfbdefbfbd1aefbfbd3a314ac48eefbfbd7cefbfbd77efbfbd097449efbfbdcaa8351aefbfbdefbfbd5befbfbdefbfbd655a62efbfbd3651efbfbdefbfbd41efbfbd64efbfbd1150efbfbd65efbfbd224720060cefbfbd11efbfbdefbfbdefbfbdefbfbd0defbfbd1439efbfbdefbfbd 

그리고 문자열 알고리즘을 사용 하시겠습니까?

pubEncryptCipher = Cipher.getInstance("RSA"); 
pubDecryptCipher = Cipher.getInstance("RSA"); 

?

+1

암호화 코드, 알고리즘 문자열 및 결과 *를 16 진수 *로 표시 할 수 있습니까? 항상 잘못된 알고리즘 문자열 인''RSA/ECB/NoPadding ''을 사용하고있는 것처럼 보입니다. 패딩 모드는 RSA 암호화/해독의 중요한 부분입니다. –

+0

@owlstead alright –

답변

0

문제는 encodedBytes.toString() 당신이 그것을 할 기대하지 않는다는 것입니다. 대신 new String(encodedBytes, StandardCharsets.ASCII);해야합니다. 또는 Java SE 1.7 호환 코드 이전의 new String(encodedBytes, Charset.forName("ASCII"));

당신은 항상 패딩 모드를 표시한다 예 : "RSA" 대신 "RSA/None/PKCS1Padding"입니다.

+0

위의 기능 중 어느 기능이 안드로이드에서 작동하는지 확인할 수 있습니까? –

+0

패딩을 추가하면 다른 오류가 발생합니다. 'PCKS1Padding'에 대해서'BadPaddingException : ... RSA_padding_check_PKCS1_type_2 : 블록 타입이 02가 아닙니다. 또한 새로운 문자열 (encodedBytes, Charset.ForName ("ASCII")'가 작동하지 않았습니다.) –

+0

공개 키가 개인 키와 일치하지 않는 경우에도 발생합니다 ... 둘의 모듈러스를 비교하여 다시 확인할 수 있습니까? 아, 그리고 바이트 배열이 아닌 문자열에'decodeBase64'를 수행하십시오.'getBytes()가 UTF-16을 반환하면 어떻게되는지 상상해보십시오.) –

관련 문제