我有一个用C#编写的加密工具,它以字符串作为输入。 当我在我的Windows机器上运行已编译的exe文件时,我得到的输出与使用mono时在远程UNIX服务器上运行它时的输出不同。
以下是一个例子:
视窗:
"encrypt.exe 01/01"
Output:
eR4et6LR9P19BfFnhGwPfA==
Unix的:
"mono encrypt.exe 01/01"
Output:
Pa8pJCYBN7+U+R705TFq7Q==
我甚至尝试将输入值放在脚本中,然后再次编译并运行它,我得到了相同的结果。
decrypt函数位于远程Web服务上,使用硬编码密钥和IV值(我使用这些值进行加密), 解密输出:
Input (String generated on windows):
eR4et6LR9P19BfFnhGwPfA==
Output:
01/01
Input (String generated on Unix):
Pa8pJCYBN7+U+R705TFq7Q==
Output:
????1
这是加密功能:
string text = args[0];
byte[] clearData = Encoding.Unicode.GetBytes(text);
PasswordDeriveBytes bytes = new PasswordDeriveBytes(password, new byte[] { 0x19, 0x76, 0x61, 110, 0x20, 0x4d, 0x65, 100, 0x76, 0x65, 100, 0x65, 0xf6 });
string a = Convert.ToBase64String(Encrypt(clearData, bytes.GetBytes(0x20), bytes.GetBytes(0x10)));
Console.Write(a);
public static byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
{
MemoryStream stream = new MemoryStream();
Rijndael rijndael = Rijndael.Create();
rijndael.Key = Key;
rijndael.IV = IV;
CryptoStream stream2 = new CryptoStream(stream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
stream2.Write(clearData, 0, clearData.Length);
stream2.Close();
return stream.ToArray();
}
这是解密功能(我不能对此进行更改):
byte[] cipherData = Convert.FromBase64String(encryptedString);
PasswordDeriveBytes bytes2 = new PasswordDeriveBytes(password, new byte[] { 0x19, 0x76, 0x61, 110, 0x20, 0x4d, 0x65, 100, 0x76, 0x65, 100, 0x65, 0xf6 });
byte[] buffer2 = Decrypt(cipherData, bytes2.GetBytes(0x20), bytes2.GetBytes(0x10));
string output = Encoding.Unicode.GetString(buffer2);
Console.Write(output);
public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
{
MemoryStream stream = new MemoryStream();
Rijndael rijndael = Rijndael.Create();
rijndael.Key = Key;
rijndael.IV = IV;
CryptoStream stream2 = new CryptoStream(stream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
stream2.Write(cipherData, 0, cipherData.Length);
stream2.Close();
return stream.ToArray();
}
答案 0 :(得分:1)
这个问题中的问题不是你正在处理的问题,但是看看结果的差异,看起来填充是一个问题,所以你可能想看看这个问题中的一些回答,但是这个答案可能有助于解决您的问题。
http://social.msdn.microsoft.com/forums/en-US/clr/thread/3df8d5aa-ea99-4553-b071-42a2ea406c7f/
当KEY,你得到这个问题 IV和加密数据不是全部 正确的块大小和 '方案'。避免这种情况的唯一方法 问题是使用IV和KEY 由算法生成。您可以 使用GenerateIV来获取算法 给你一个IV。把它存起来 在某个安全的地方你需要它。 然后简单地调用encrypt方法 并传入数据。算法 然后将加密数据并设置 新生成的关键属性 键。用加密存储它 数据。这就是它的全部内容。
虽然它已过时,但有各种原因造成差异的回复,但如果您可以解密那么差异的原因可能是有效的,这里给出: http://lists.ximian.com/pipermail/mono-list/2006-November/033456.html
那么,如果你可以加密一个并解密另一个(你能做到吗?)那么如果结果不同会有什么不同呢?
答案 1 :(得分:0)
问题可能是输出是unicode,终端显示为ascii。我常见吗?代替被误解的unicode字符。
检查字节数组的数值和数量。
Ascii是unicode数量的一半,因为每个字符有两个字节。
答案 2 :(得分:0)
您是否检查了测试字符串是否有新行? Windows测试字符串将具有回车符+换行符,而Unix字符串只有换行符。