1 つのオプションは、BouncyCastle ライブラリを使用することです。これらは Aes/Ofb/NoPadding をサポートしています。
もう 1 つのオプションは、C# フレームワークの System.Security.Cryptography.Aes を使用し、PaddingMode.Zeros を使用して暗号化してから、暗号化されたデータを入力データと同じ長さに切り詰めることです (暗号化されたテキストの末尾にある埋め込みデータを破棄します)。復号化するときは、パディング (ガベージまたはゼロ) を暗号文に追加してブロック長に合わせ、PaddingMode.None を設定し、復号化して、最後にパディングされたバイトを破棄します (それらは偽物になります)。このようなもの:
var aes2 = Aes.Create();
aes2.KeySize = 128;
aes2.BlockSize = 128;
aes2.Mode = CipherMode.CFB;
aes2.Padding = PaddingMode.Zeros;
var aes2Data = new byte[buff.Length];
// strip padded data
Buffer.BlockCopy(aes2.CreateEncryptor().TransformFinalBlock(buff, 0, buff.Length), 0,
aes2Data, 0, buff.Length);
Console.WriteLine("Aes2 size: {0}", aes2Data.Length);
// validate aes2
var size = aes2Data.Length;
var pad = aes2Data.Length % 16;
if (pad != 0)
{
var tmp = new byte[aes2Data.Length + 16 - pad];
Buffer.BlockCopy(aes2Data, 0, tmp, 0, aes2Data.Length);
aes2Data = tmp;
}
var aes2Decr = Aes.Create();
aes2Decr.Padding = PaddingMode.None;
aes2Decr.Key = aes2.Key;
aes2Decr.Mode = aes2.Mode;
aes2Decr.IV = aes2.IV;
var data2 = aes2Decr.CreateDecryptor().TransformFinalBlock(aes2Data, 0, aes2Data.Length);
valid = data2.Take(size).SequenceEqual(buff);
if (!valid)
throw new ApplicationException("Invalid data");