RSA によるデータの暗号化/復号化を実装しました。ローカルで暗号化/復号化するだけで機能しますが、暗号化されたデータを送信すると、BadPaddingException: Data must start with zero が発生します。
ネットワーク経由でデータを送信するには、クライアント側でバイト配列から文字列 (ヘッダーで送信しています) に変更し、それを取得してサーバー側でバイト配列に戻す必要があります。
ローカル暗号化/復号化のコードは次のとおりです (秘密鍵を使用して暗号化し、公開鍵を使用して復号化します):
// Encryption:
String message = "HELLO";
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, privateKey); // privateKey has type java.security.PrivateKey
byte [] encryptedBytes = rsa.doFinal(message.getBytes());
// Decryption:
rsa.init(Cipher.DECRYPT_MODE, publicKey); // type of publicKey: java.security.PublicKey
byte [] ciphertext = rsa.doFinal(encryptedBytes);
String decryptedString = new String(ciphertext, "UTF-8");
DecryptedString とメッセージは同じで、すべて正常に動作します。
次に、暗号化のためだけにクライアント側で同じコードを使用し、さらに次を使用して暗号文を文字列に変更します。
String encryptedString = new String(ciphertext, "UTF-8");
サーバー側では、次のことを行います。
String message = request.getHeader("Message");
byte [] msgBytes = message.getBytes("UTF-8");
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, publicKey);
byte [] decryptedMsg = rsa.doFinal(msgBytes);
String decryptedString = new String(decryptedMsg, "UTF-8");
これは機能せず、BadPaddingException が発生します。
「RSA/ECB/PKCS1Padding」や「RSA/ECB/NoPadding」など、別の暗号のインスタンスを使用してみましたが、これは役に立ちませんでした。また、BASE64 を使用して文字列を変換しようとしましたが、別の例外が発生しました: IllegalBlockSizeException.
文字列をバイト配列に、またはその逆に変換する際におそらく間違っていることはわかっていますが、それを行う正しい方法がわかりません。助けてください!