Padding is invalid and cannot be removed
一部のデータを復号化しようとすると、実行時エラーが発生します。stackoverflow で見つけた同様のスレッドをすべて読み、次の問題を検討しました。
暗号化に使用されたものとは異なる復号化用のキーを指定すると、上記の問題が発生する可能性があります。ただし、ソースで確認できるように、テスト目的でキーをハードコーディングしましたが、それでも実行時エラーが発生します。
アプリケーションは、暗号化に使用されるものとは異なるパディング モードを復号化に使用しようとしている可能性があります。暗号化または復号化プロセス中にモードを明示的に設定しても、問題は解決しませんでした。
FlushFinalBlock
メソッドを使用して、アプリケーションに最後のビットをblocksize
. Write メソッドの下に配置しようとしましたが、どちらも機能しませんでした。
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
csEncrypt.FlushFinalBlock();
}
以下は私のコードのスニペットです:
// Encrypt
private byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
{
Key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
IV = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
byte[] encrypted;
// Create an RijndaelManaged object
// with the specified key and IV.
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
rijAlg.Padding = PaddingMode.PKCS7;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
// Write all data to the stream.
swEncrypt.Write(plainText);
csEncrypt.FlushFinalBlock();
}
encrypted = msEncrypt.ToArray();
MessageBox.Show("Encrypted str: " + Encoding.UTF8.GetString(encrypted).ToString());
}
}
}
// Update buffer length
this.Buflen = encrypted.Length;
MessageBox.Show("Byte count: " + (Encoding.UTF8.GetByteCount(encrypted.ToString())).ToString());
MessageBox.Show("Decrypted: " + DecryptStringFromBytes(encrypted, this.Encryption_key, this.Encryption_iv));
// Return the encrypted bytes from the memory stream.
return encrypted;
}
// Decrypt
private string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
{
Key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
IV = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
UTF8Encoding e = new UTF8Encoding();
MessageBox.Show("ciperText " + cipherText.Length);
//cipherText = e.GetBytes(cipherText);
//MessageBox.Show("ciperText2 Length " + cipherText.Length);
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
rijAlg.Padding = PaddingMode.PKCS7;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
if (cipherText.Length != rijAlg.BlockSize)
{
throw new InvalidOperationException("Invalid cipherText length");
}
plaintext = srDecrypt.ReadToEnd();
csDecrypt.FlushFinalBlock();
}
}
}
}
return plaintext;
}
byte[] encoded_message = new byte[16];
encoded_message = EncryptStringToBytes("test", this.Encryption_key,this.Encryption_iv);
昨日の朝からこれを機能させようとしています。これまでに見つけたソリューションはどれも、私のアプリケーションでは機能しませんでした。コードが少しごちゃごちゃしているように見えるかもしれませんが、使用されていない部分は気にしないでください。これを機能させたら、確かに少しリファクタリングが必要になります。
ご覧のとおり、テスト目的でハードコードされたキーと IV を使用している間も実行時エラーが発生するため、暗号化に使用されたものとは異なる資格情報を復号化に渡すことは原因ではありません。
誰でもこれを解決する方法についてアイデアを思いつくことができますか? ありがとう。