我有用AesCryptoServiceProvider
加密的磁盘上的文件。 我需要将代码转换为PCL(它没有类AesCryptoServiceProvider
)。所以我想用Bouncy Castle(https://www.nuget.org/packages/Portable.BouncyCastle/)来读取和保存文件而不改变加密。并防止需要转换所有文件。将AesCryptoServiceProvider的加密转换为BouncyCastle
Key
是32个字节长。 IV
长16字节。
下面是原来的代码:
private static byte[] Encrypt(string plainText, byte[] Key, byte[] IV)
{
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream outputStream = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
}
return outputStream.ToArray();
}
}
}
的AesCryptoServiceProvider
默认模式是CBC
与PKCS7
类型的填充,然后我试图与类CbcBlockCipher
和Pkcs7Padding
。这是我最后一次尝试:
private static byte[] Encrypt(byte[] input, byte[] key, byte[] IV)
{
var keyParameter = new KeyParameter(key);
var parameters = new ParametersWithIV(keyParameter, IV);
var cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), new Pkcs7Padding());
cipher.Init(true, parameters);
var rsl = new byte[cipher.GetOutputSize(input.Length)];
var outOff = cipher.ProcessBytes(input, 0, input.Length, rsl, 0);
cipher.DoFinal(rsl, outOff);
return rsl;
}
原来的结果为文本“测试”是8jykPv2OSILKjJwvgLRr1w==
,但随着新的代码是BaYeiuWSnRiHXBpwt19Dag==
。
那我想念什么?
感谢您的帮助!
更新#1: 这里是键和值IV:
private static byte[] KEY = {98, 193, 95, 78, 211, 151, 118, 57, 179, 5, 85, 181, 133, 20, 94, 101, 184, 175, 94, 164, 150, 119, 75, 207, 189, 178, 21, 213, 13, 217, 174, 44};
private static byte[] IV = {1, 199, 179, 189, 160, 220, 229, 238, 179, 14, 255, 147, 187, 49, 179, 134 };
更新#2: 对于充气城堡,将我plainText
到input
这一行:
var input = Encoding.Unicode.GetBytes(plainText);
差异来自那里...
什么是关键和IV? –
@JamesKPolk:增值! – Kipotlov
您能借此机会通过安全加密取代加密吗?由于它使用了一个常量IV(完全忽略了IV的要点)并且缺少一个MAC,所以现有的比较弱。 – CodesInChaos