2017-12-20 31 views
0

私はPKCS8秘密鍵へのテキストを暗号化し、X509公開鍵で解読しようとしています。X509公開鍵でjava解読

 


     public static String decryptByPublicKey(String data, String keyHash) { 
      final String KEY_ALGORITHM = "RSA"; 
      final int MAX_DECRYPT_BLOCK = 128; 

      try { 

       byte[] keyBytes = Base64.getDecoder().decode(keyHash); 

       X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes); 
       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); 
       Key publicKey = keyFactory.generatePublic(publicKeySpec); 
       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); 
       cipher.init(Cipher.DECRYPT_MODE, publicKey); 

       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       int offSet = 0; 
       byte[] cache; 
       byte[] buffer =data.getBytes(); 
       int inputLen = buffer.length; 
       int i = 0; 

       while (inputLen - offSet > 0) { 
        if (inputLen - offSet > MAX_DECRYPT_BLOCK) { 
         cache = cipher.doFinal(buffer, offSet, MAX_DECRYPT_BLOCK); 
        } else { 
         cache = cipher.doFinal(buffer, offSet, inputLen - offSet); 
        } 
        out.write(cache, 0, cache.length); 
        i++; 
        offSet = i * MAX_DECRYPT_BLOCK; 
       } 

       byte[] decryptedData = out.toByteArray(); 
       out.close(); 

       return new String(decryptedData, "UTF-8"); 

      } catch (Exception e) { 
       logger.error("decryptByPublicKey - Exception: ", e); 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    It shows BadPaddingException. 
    javax.crypto.BadPaddingException: Decryption error 
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) 
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291) 
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2223) 

 

私は(公開鍵で暗号化し、秘密鍵で復号する)方法を逆にしようとしましたが、大丈夫です。

問題は何ですか?エラーから

答えて

0

はそれがBadPaddingException.javax.crypto.BadPaddingExceptionを示し を与えられた:復号化エラー

(int型inputLen = buffer.length)にあなたのバッファのサイズをご確認ください。必要なブロックサイズになるようにデータをパディングする必要があります。

+0

データ文字列はjson文字列です。ちょうどバッファバイト配列の長さはjson文字長と同じになります。 MAX_DECRYPT_BLOCKは128の長さに設定されているためです。だから、while..loopは長さを制御すると思います。 キャッシュ= cipher.doFinal(バッファ、オフセット、MAX_DECRYPT_BLOCK) 〜 キャッシュ= cipher.doFinal(バッファ、0、128); 私は何が間違っているのか分かりません。 –

+0

暗号化コードを共有できますか? – rab

+0

暗号化コードは他人からのものですので、このコードから –

0

最後に一度だけdoFinal()に電話をかけてください。たびにupdate()に電話する必要があります。

しかし、これは意味がありません。秘密鍵による暗号化は暗号化ではなく、デジタル署名です。

+0

はい、私は両方の当事者のデジタル署名を行っています –

+0

同じこととして、それは公開鍵で暗号化に使用しています。 。 –

+0

しかし私の答えで述べたエラーは残っています。私はあなたがループを必要としているかどうかは不明です。暗号文アレイ全体の 'Cipher.doFinal()'は十分なものでなければなりません。内部でRSAのブロックサイズ要件を満たす必要があります。 – EJP

関連する問題