我在磁盘上有用AesCryptoServiceProvider加密的文件。我需要将代码转换为PCL (它没有类AesCryptoServiceProvider)。因此,我想使用https://www.nuget.org/packages/Portable.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的默认模式是带有PKCS7类型填充的CBC,然后我尝试使用类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 :这里的是Key和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);区别就在那里..。
发布于 2015-11-02 15:57:16
在使用BouncyCastle调用Encrypt()方法之前,我用Encoding.Unicode.GetBytes(plainText);而不是Encoding.UTF8.GetBytes(plainText);转换了字符串
使用此修复,两种方法都会得到相同的结果!
发布于 2015-11-02 15:32:15
问题在于流器的编码。当写入加密流时,会产生相同的结果:
[TestMethod]
public void windows()
{
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 };
byte[] IV = { 1, 199, 179, 189, 160, 220, 229, 238, 179, 14, 255, 147, 187, 49, 179, 134 };
byte[] input = System.Text.Encoding.UTF8.GetBytes("test");
string win = Convert.ToBase64String(Encrypt_win(input, KEY, IV));
string bc = Convert.ToBase64String(Encrypt_bc(input, KEY, IV));
Assert.AreEqual(win, "8jykPv2OSILKjJwvgLRr1w==");
Assert.AreEqual(bc, "8jykPv2OSILKjJwvgLRr1w==");
}
//private static byte[] Encrypt(string plainText, byte[] Key, byte[] IV)
private static byte[] Encrypt_win(byte[] input, 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))
{
csEncrypt.Write(input, 0, input.Length);
/*
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//swEncrypt.Write(plainText);
swEncrypt.Write(input);
}
*/
}
return outputStream.ToArray();
}
}
}
private static byte[] Encrypt_bc(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;
}https://stackoverflow.com/questions/33440377
复制相似问题