多くの調査を行いましたが、私の問題に対する答えが見つかりませんでした。私は.NETでAES暗号化(Rijndaelブロックサイズ128ビット)を行い、Android(AES)で同じパスワード、ソルト、およびIVを使用して復号化を行っています。
C# 暗号化コード スニペット:
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
PasswordDeriveBytes password = new PasswordDeriveBytes(
passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);
byte[] keyBytes = password.GetBytes(keySize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Padding = PaddingMode.PKCS7;
symmetricKey.BlockSize = 128;
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
keyBytes,
initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,
encryptor,
CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
string cipherText = Convert.ToBase64String(cipherTextBytes);
Android 復号化コード スニペット:
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), iterationCount);
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithSHA1And128BitAES-CBC-BC").generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv.getBytes()));
byte[] decrypted = cipher.doFinal(encrypted);
cipher.doFinal 呼び出しは、次の例外をスローします。
「05-02 18:17:38.239: W/System.err(25547): javax.crypto.BadPaddingException: パッド ブロックが破損しています」
.NET と Android の両方でパディングを「PKCS7Padding」に設定し、暗号化ブロック サイズを 128 ビットに設定しました。
ただし、Android での暗号化と Android での復号化は正常に機能します。Encrypt in .NET と Decrypt in .NET も同様に正常に動作します。
サンプル テスト:
String PlainText = "hello world";
String EncryptedDotNetblob = "JyijoGEALMI25Zej7d+fMg==";
String EncryptedAndroidblob = "1HhuTQaLRJEK4zxI9FAO6A==";
上記のように、ブロブも異なります。
ここで何が問題なのか知っている人はいますか?