現在、Java を使用して、C# で作成された Base64 でエンコードされた RSA 暗号化文字列を復号化すると、次のエラーが発生します。
javax.crypto.BadPaddingException: PKCS#1 ブロック タイプ 2 またはゼロ パディングではありません
.NET と Java からの交換の間のセットアップ プロセスは、.NET キー ストアで秘密鍵を作成し、作成された PEM ファイルから抽出し、keytool を使用して秘密鍵で JKS バージョンを作成することによって行われます。Java は、作成済みの JKS をロードし、Base64 文字列をバイト配列にデコードしてから、秘密鍵を使用して復号化します。
暗号化された文字列を作成する C# のコードは次のとおりです。
public string Encrypt(string value) {
byte[] baIn = null;
byte[] baRet = null;
string keyContainerName = "test";
CspParameters cp = new CspParameters();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyContainerName = keyContainerName;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// Convert the input string to a byte array
baIn = UnicodeEncoding.Unicode.GetBytes(value);
// Encrypt
baRet = rsa.Encrypt(baIn, false);
// Convert the encrypted byte array to a base64 string
return Convert.ToBase64String(baRet);
}
入力された文字列を復号化するJavaのコードは次のとおりです。
public void decrypt(String base64String) {
String keyStorePath = "C:\Key.keystore";
String storepass = "1234";
String keypass = "abcd";
byte[] data = Base64.decode(base64String);
byte[] cipherData = null;
keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream(keyStorePath), storepass.toCharArray());
RSAPrivateKey privateRSAKey = (RSAPrivateKey) keystore.getKey(alias, keypass.toCharArray());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateRSAKey);
cipherData = cipher.doFinal(data);
System.out.println(new String(cipherData));
}
ステップが欠けている、またはパディングやアイテムを変更する必要がある場所に誰かが気づいていますか? このサイトや他のサイトを何時間も読んできましたが、具体的な解決策は見つかりませんでした。
大変お世話になりました。
ありがとう。-マット