簡體   English   中英

使用RSA私鑰解密

[英]Decrypting with RSA Private Key

因此,我正在嘗試使用RSA公鑰和私鑰對字符串進行加密/解密。 它可以很好地加密,但是每當我嘗試解密加密的字符串時,我都會得到非常奇怪的輸出。 例如,“ hello”解密為:

] T1#Z} - pԏh25〜E'bh〜-Itk> +v ...NA y。[@ jp!2p X@ oZ $ ٥。@& v = A e A m ; @d <“ &}} rq5U的Jc? Db A ! {W | IEI魈S] ' 88 % ON:S E J0 4 l 3 ϓ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;
}

十六進制解密的字符串:

efbfbdefbfbdefbfbdc78d2defbfbd6e2fefbfbdefbfbdefbfbd50efbfbd73efbfbd6defbfbd31efbfbd40117defbfbdefbfbd2cefbfbd576ed39c2aefbfbd41533defbfbdefbfbd1a167c23efbfbdd0a11a3213355eefbfbdefbfbdefbfbd6145efbfbd55efbfbdefbfbd7d09efbfbd700814efbfbdefbfbd687b225eefbfbd3c00efbfbdefbfbd3509efbfbd6c5eefbfbdefbfbd79efbfbdefbfbd033d77efbfbd71efbfbd57efbfbd7e76d6a101efbfbd4aefbfbd4a0540efbfbdefbfbd297f6fefbfbd73efbfbdefbfbdefbfbd010defbfbdefbfbdefbfbd00efbfbd490706efbfbdefbfbdefbfbd322435efbfbd02efbfbdefbfbd1dd79477efbfbd13efbfbdd5bb57efbfbdefbfbd0aefbfbd39404b53efbfbdefbfbd06165aefbfbd32efbfbdefbfbd4665efbfbddd9d6aefbfbd0842efbfbdefbfbd7c35efbfbdefbfbdefbfbd3e7eefbfbdefbfbd11efbfbd1fc7b839efbfbd44efbfbdefbfbd1aefbfbd3a314ac48eefbfbd7cefbfbd77efbfbd097449efbfbdcaa8351aefbfbdefbfbd5befbfbdefbfbd655a62efbfbd3651efbfbdefbfbd41efbfbd64efbfbd1150efbfbd65efbfbd224720060cefbfbd11efbfbdefbfbdefbfbdefbfbd0defbfbd1439efbfbdefbfbd

通過字符串算法,您的意思是:

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

問題在於, encodedBytes.toString()不會執行您期望的操作。 您需要執行new String(encodedBytes, StandardCharsets.ASCII); 代替。 new String(encodedBytes, Charset.forName("ASCII")); Java SE 1.7兼容代碼之前的版本。

您應該始終指示填充模式; 請使用"RSA/None/PKCS1Padding"代替"RSA"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM