Функция шифрования дает различный вывод на Windows и Unix - PullRequest
7 голосов
/ 03 мая 2011

У меня есть инструмент шифрования, написанный на C #, который принимает строку в качестве ввода.Когда я запускаю скомпилированный exe-файл на моей машине с Windows, я получаю вывод, который отличается от того, когда я запускаю его на удаленном сервере UNIX с использованием mono.

Вот пример:

Windows:

"encrypt.exe 01/01"
Output:
eR4et6LR9P19BfFnhGwPfA==

Unix:

"mono encrypt.exe 01/01"
Output:
Pa8pJCYBN7+U+R705TFq7Q==

Я даже попытался ввести входное значение в скрипт, а затем скомпилировать и запустить его снова, и я получил те же результаты.

Функция дешифрования находится на удаленном веб-сервисе и использует жестко закодированный ключ и значения 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();
}

Ответы [ 3 ]

1 голос
/ 03 мая 2011

Проблема в этом вопросе не в том, с чем вы имеете дело, но, глядя на разницу в результатах, кажется, что заполнение было проблемой, поэтому вы можете посмотреть на некоторые ответы в этом вопросе, но этот ответможет помочь решить вашу проблему.

http://social.msdn.microsoft.com/forums/en-US/clr/thread/3df8d5aa-ea99-4553-b071-42a2ea406c7f/

Эта проблема возникает, когда ключ, ключ IV и зашифрованные данные имеют не все правильные размеры блока и «схему»,Единственный способ избежать этой проблемы - использовать IV и KEY, сгенерированные алгоритмом.Вы можете использовать GenerateIV, чтобы получить алгоритм для генерации IV.Храните это в безопасном месте, так как вам это понадобится.Затем просто вызовите метод шифрования и передайте данные.Затем алгоритм зашифрует данные и установит для свойства Key только что сгенерированный ключ.Сохраните это с вашими зашифрованными данными.Вот и все, что нужно сделать.

Хотя он устарел, ответ о том, что существуют различные причины различий, но если вы можете расшифровать данные, причины различий могут быть действительными, приведен здесь:http://lists.ximian.com/pipermail/mono-list/2006-November/033456.html

Итак, если вы можете зашифровать одну и расшифровать другую (можете ли вы это сделать?), То какая разница, если результаты отличаются?

0 голосов
/ 03 марта 2013

Вы проверили свою тестовую строку на наличие новых строк? Тестовая строка Windows будет иметь возврат каретки + перевод строки, в то время как строка Unix будет иметь только перевод строки.

0 голосов
/ 03 мая 2011

Возможно, проблема в том, что на выходе выводится Unicode, а терминал показывает ascii. Я обычно вижу? вместо неправильно понятых символов юникода.

Проверьте числовые значения массива байтов и количество.

Ascii - половина количества юникода, поскольку для каждого символа есть два байта.

...