2013-12-11 224 views
1

所以我試圖使用RSA公鑰和私鑰對字符串進行加密/解密。它加密罰款,但每當我試圖解密加密的字符串,我得到一個非常奇怪的輸出。例如, 「你好」,以解密:使用RSA私鑰解密

] T1#Z} - pԏh25〜E'bh〜-I t k > + v ?NA y [@ jp!2p [email protected] oZ $5 @ & v = A e A m ; @d <「&} }r q5U ? J c �Db�A�! { w| IE Ì魈S] �'����88��%������ ��O.N:SEJ04l3Ύn3{。

我不知道是否有什麼毛病我的解密算法性能。THM或者如果它做轉換的解密字節轉換成字符串(或類似的規定)

這裏的解密方法:

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; 
} 

解密的字符串以十六進制表示:

efbfbdefbfbdefbfbdc78d2defbfbd6e2fefbfbdefbfbdefbfbd50efbfbd73efbfbd6defbfbd31efbfbd40117defbfbdefbfbd2cefbfbd576ed39c2aefbfbd41533defbfbdefbfbd1a167c23efbfbdd0a11a3213355eefbfbdefbfbdefbfbd6145efbfbd55efbfbdefbfbd7d09efbfbd700814efbfbdefbfbd687b225eefbfbd3c00efbfbdefbfbd3509efbfbd6c5eefbfbdefbfbd79efbfbdefbfbd033d77efbfbd71efbfbd57efbfbd7e76d6a101efbfbd4aefbfbd4a0540efbfbdefbfbd297f6fefbfbd73efbfbdefbfbdefbfbd010defbfbdefbfbdefbfbd00efbfbd490706efbfbdefbfbdefbfbd322435efbfbd02efbfbdefbfbd1dd79477efbfbd13efbfbdd5bb57efbfbdefbfbd0aefbfbd39404b53efbfbdefbfbd06165aefbfbd32efbfbdefbfbd4665efbfbddd9d6aefbfbd0842efbfbdefbfbd7c35efbfbdefbfbdefbfbd3e7eefbfbdefbfbd11efbfbd1fc7b839efbfbd44efbfbdefbfbd1aefbfbd3a314ac48eefbfbd7cefbfbd77efbfbd097449efbfbdcaa8351aefbfbdefbfbd5befbfbdefbfbd655a62efbfbd3651efbfbdefbfbd41efbfbd64efbfbd1150efbfbd65efbfbd224720060cefbfbd11efbfbdefbfbdefbfbdefbfbd0defbfbd1439efbfbdefbfbd 

而字符串算法的意思是:

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

+1

你能告訴我們加密代碼,算法字符串和結果*在十六進制*?看起來你正在使用''RSA/ECB/NoPadding「'這總是不正確的算法字符串;填充模式是RSA加密/解密的重要部分。 –

+0

@owlstead好了更新 –

回答

0

問題是encodedBytes.toString()沒有達到您期望的效果。您需要改爲new String(encodedBytes, StandardCharsets.ASCII);。或者在Java SE 1.7兼容代碼之前使用new String(encodedBytes, Charset.forName("ASCII"));

您應該始終指示填充模式;請使用例如"RSA/None/PKCS1Padding"而不是"RSA"

+0

你可以檢查上述哪些功能在android上工作(對於你正在使用的特定版本)? –

+0

添加任何種類的填充都會給我一個不同的錯誤。對於'PCKS1Padding',它給了我'... BadPaddingException:... RSA_padding_check_PKCS1_type_2:塊類型不是02'。 'new String(encodedBytes,Charset.ForName(「ASCII」)''不起作用 –

+0

如果您的公鑰與私鑰不匹配,那麼也會發生這種情況......您可以通過比較兩者的模數來進行仔細檢查嗎?哦,並且在字符串上執行'decodeBase64',而不是在字節數組上執行(你能想象如果'getBytes()'返回UTF-16會發生什麼?) –