私はいくつかの暗号の問題を抱えていて、私が間違ったことを見つけられません。Android で RSA を使用して AESkey を暗号化し、C# を使用してサーバー側で復号化しようとしていますが、「Bad Data」例外が引き続き発生します。
Base64エンコーディングを使用して暗号化されたキーをクライアントからサーバーに移動しましたが、JSON POSTリクエストを使用してクライアント(Androidアプリ)から移動した後、キーに多数の「\u000a」があり、暗号化されたデータの長さが941になりました。 「復号化のために大きなデータ」を削除すると、長さが 920 になり、80 の 8 バイト反復が可能になり、現在の不良データの問題に到達しました。
キーの長さとアルゴリズムが正しく、両方が 2048 ビットのキーに設定され、PKCS1Padding を使用していることを確認しました。
「Bad Data」例外 この例外は、次のシナリオでスローされます。
a) 復号化に使用される RSA 秘密鍵が、暗号化に使用される RSA 公開鍵と一致しません。
b) Decrypt() メソッドに渡されたバイナリ データが正しくありません。これは、アプリケーション コードが暗号化されたデータの長さについて想定した場合、または渡されたデータが Encrypt() メソッドから返される正確なバイト数と一致しない場合に発生する可能性があります。
RSACryptoServiceProvider.ToXMLString(false); を返す GET を使用してサーバーから取得することにより、Android で公開キーを取得します。また、秘密鍵に同じキーストアを使用するため、1 であることがわかりません。
そして、私が知る限り、C# デクリプターは、暗号化されたデータのサイズについて何の仮定もしていません。ブロックサイズを 8 に設定している可能性がありますが、それは暗号化された AESkey のサイズを知った後でした。
私は解決策を探していましたが、解決策が見つからなかったので、助けていただければ幸いです。私が愚かで簡単なことを見逃していたら申し訳ありませんが、私がそうで、それを見ることができない場合は、ウィンカーをオンにしています。
Java 暗号化
private byte[] encryptRSA(byte [] data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
//instance of singleton PublicKey
AppPublicKey currKey = AppPublicKey.getInstance();
Log.d("ENCRYPT.MOD: ", currKey.getModBytes().toString());
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(1,currKey.getModBytes()), new BigInteger(1,currKey.getExpBytes()));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData = cipher.doFinal(data);
Log.d("RSAENCRYPTION: ",Base64.encodeToString(cipherData, 1));
return cipherData;
}
C# 復号化
public string DecryptString(string inputString, int dwKeySize)
{
// TODO: Add Proper Exception Handlers
CspParameters cp = new CspParameters();
cp.KeyContainerName = "real_Keystore";
RSACryptoServiceProvider rsaCryptoServiceProvider
= new RSACryptoServiceProvider(dwKeySize,cp);
int base64BlockSize = 8;
int iterations = inputString.Length / base64BlockSize;
ArrayList arrayList = new ArrayList();
for (int i = 0; i < iterations; i++)
{
byte[] encryptedBytes = Convert.FromBase64String(
inputString.Substring(base64BlockSize * i, base64BlockSize));
//Array.Reverse(encryptedBytes);
arrayList.AddRange(rsaCryptoServiceProvider.Decrypt(
encryptedBytes, false));
}
return Encoding.UTF32.GetString(arrayList.ToArray(
Type.GetType("System.Byte")) as byte[]);
}