RC4 на .net для расшифровки на Ruby

Мне нужно зашифровать текстовую строку в приложении .net, используя известный текстовый ключ, а затем расшифровать ее в Ruby, используя тот же известный ключ... однако у меня возникают проблемы с этим. Я думаю, что это связано с проблемами кодирования строк. Примеры с .Net на Ruby RC4 оказались неуловимыми.

Я получаю неверную расшифровку на стороне Ruby. Шифрование/дешифрование отлично работает в реализации .net. Но когда я копирую зашифрованное значение в реализацию Ruby и использую тот же ключ, я не получаю исходное значение.

Ниже моя реализация .net RC4 (это не требует высочайшего уровня безопасности, но немного приятно) :)

На стороне ruby ​​я использую ruby-rc4 https://github.com/caiges/Ruby-RC4< /а>

       public string keytext = "thisismykey";
    public Form1()
    {
        InitializeComponent();
    }
    public void RC4(ref Byte[] bytes, Byte[] key)
    {

        Byte[] s = new Byte[256];
        Byte[] k = new Byte[256];
        Byte temp;
        int i, j;

        for (i = 0; i < 256; i++)
        {
            s[i] = (Byte)i;
            k[i] = key[i % key.GetLength(0)];
        }

        j = 0;
        for (i = 0; i < 256; i++)
        {
            j = (j + s[i] + k[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }

        i = j = 0;
        for (int x = 0; x < bytes.GetLength(0); x++)
        {
            i = (i + 1) % 256;
            j = (j + s[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            int t = (s[i] + s[j]) % 256;
            bytes[x] ^= s[t];
        }
    }
    static byte[] GetBytes(string str)
    {
        Byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
    static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Byte[] content = Encoding.ASCII.GetBytes(textBox1.Text);
        RC4(ref content, Encoding.ASCII.GetBytes(keytext));
        textBox2.Text = Encoding.ASCII.GetString(content);
        RC4(ref content, Encoding.ASCII.GetBytes(keytext));
        label1.Text = Encoding.ASCII.GetString(content);
    }

person Webjedi    schedule 21.05.2012    source источник
comment
Можете ли вы уточнить, какая именно проблема у вас возникла? Сообщение об ошибке? Неверный результат?   -  person PinnyM    schedule 21.05.2012
comment
Обновленный вопрос: я получаю недопустимую расшифровку на стороне Ruby. Шифрование/дешифрование отлично работает в реализации .net. Но когда я копирую зашифрованное значение в реализацию Ruby и использую тот же ключ, я не получаю исходное значение.   -  person Webjedi    schedule 21.05.2012
comment
Что вы используете для передачи хэша из .net в ruby? Есть ли какая-то конкретная кодировка, которую вы используете на рубиновом конце (UTF-8 вместо ASCII)?   -  person PinnyM    schedule 21.05.2012
comment
О, и можете ли вы проверить, дает ли шифрование ruby ​​тот же хэш, что и .NET? Это поможет выявить источник проблемы...   -  person PinnyM    schedule 22.05.2012
comment
.net дает ‹?- (без кавычек) Ruby дает ‹\x85-\x1F (без кавычек) Я использую блокнот для передачи значений... (в настоящее время) Я планирую в конечном итоге запихнуть их в базу данных.   -  person Webjedi    schedule 22.05.2012
comment
Это '?' действительно вопросительный знак или непечатный символ? Можете ли вы извлечь двоичные данные (до преобразования в ASCII/UTF-8) и сравнить значения байтов?   -  person PinnyM    schedule 22.05.2012
comment
60, 133, 45, 31 - это массив байтов, который помещается в textBox2, а label1 устанавливается на исходное слово star... так что он проходит в оба конца в программе .net.   -  person Webjedi    schedule 22.05.2012
comment
Почему RC4? Его очень легко использовать неправильно, став небезопасным. Например, ваш код полностью сломан, потому что, если вы используете один и тот же ключ дважды без IV, тривиально вычислить xor открытых текстов, устраняя шифрование. И благодаря ключевым недостаткам RC4, неправильное использование IV также легко. Вот как WEP был взломан.   -  person CodesInChaos    schedule 22.05.2012
comment
Я во многом согласен с вами, CodeInChaos... в этом случае это шифрование должно использоваться во время миграции с одной системы на другую, где оно будет повторно зашифровано... эта часть шага является временной... но ваша точка зрения сделанный.   -  person Webjedi    schedule 22.05.2012


Ответы (1)


Проблема, вероятно, возникает из-за того, что кодировка ASCII является 7-битной и не может воссоздать символы для значений выше 127. Попробуйте кодировать с помощью UTF-8 или преобразовать массив байтов в строку Base64.

person PinnyM    schedule 21.05.2012