RC4 128-битное шифрование в C#

Мне нужно выполнить 128-битное шифрование RC4, я использую.NET и C#. Есть ли встроенная функция для этого.

Если нет, я нашел эту функцию, которая может сделать это:

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];
    }
}

Но я не знаю, 128-битный он или нет, он выглядит 256, но я действительно не знаю разницы.

4 ответа

Решение

Согласно http://en.wikipedia.org/wiki/Rc4 алгоритм RC4 может иметь длину ключа, которая может находиться в диапазоне 1 ≤ keylength ≤ 256
Вот пример, по которому можно определить размер ключа: http://tofuculture.com/Blog/post/RC4-Encryption-in-C.aspx
Загрузите исходный код и просмотрите RC4.cs.

Настройка ключа - первая и самая сложная фаза этого алгоритма. Во время установки N-битного ключа (N - это длина вашего ключа) ключ шифрования используется для генерации переменной шифрования с использованием двух массивов: состояние и ключ и N-количество операций микширования. Эти операции смешивания состоят из перестановки байтов, операций по модулю и других формул.

В прикрепленном проекте вы можете увидеть, как я это делаю, в свойстве набора EncryptionKey класса RC4Engine.

это интересная статья на эту тему - http://www.codeproject.com/Articles/5068/RC4-Encryption-Algorithm-C-Version

Я могу вам сказать, что в.Net Framework нет алгоритма RC4. Есть крипто RC2... но нет RC4.

Алгоритм RC4 использует переменную длину ключа (не только 128-битную) и одинаковое количество зашифрованных и исходных данных.

      public class RC4
{
    // Creates an RC4 instance using the given key of any length.
    public RC4(byte[] key)
    {
        CreateSBlock();
        KeyScheduling(key);
    }
    
    // Performs encryption or decryption of the data.
    public void Cipher(byte[] buffer, int offset, int count)
    {
        for (int i = offset; i < count; i++)
        {
            buffer[i] = unchecked((byte)(buffer[i] ^ NextByte()));
        }
    }

    private byte[] sblock = new byte[256]; // The array contained S-block.
    private int x = 0, y = 0;
    
    private void CreateSBlock() // S-block initialization.
    {
        for (int i = 0; i < 256; i++)
        {
            sblock[i] = (byte)i;
        }
    }
    
    private void KeyScheduling(byte[] key) // KSA
    {
        for (int i = 0, j = 0, l = key.Length; i < 256; i++)
        {
            j = (j + sblock[i] + key[i % l]) % 256;
            Swap(sblock, i, j);
        }
    }
    
    private void Swap(byte[] array, int index1, int index2)
    {
        byte b = array[index1];
        array[index1] = array[index2];
        array[index2] = b;
    }
    
    private byte NextByte() // PRGA
    {
        x = (x + 1) % 256;
        y = (y + sblock[x]) % 256;
        Swap(sblock, x, y);
        return sblock[(sblock[x] + sblock[y]) % 256];
    }
}

Вот библиотека C#, предоставляющая алгоритм RC4 для использования в проектах .NET. Пример использования:

      using System.Security.Cryptography;
// ...

byte[] password = Encoding.UTF8.GetBytes("password");
byte[] data = Encoding.UTF8.GetBytes("secret");
byte[] encrypted, restored;
using (var arc4 = ARC4.Create(password)
{
   using(var transform = arc4.CreateEncryptor()) // Encryption.
   {
       encrypted = transform.TransformFinalBlock(data, 0, data.Length);
   }

   using(var transform = arc4.CreateDecryptor()) // Decryption.
   {
       restored = transform.TransformFinalBlock(data, 0, data.Length);
   }
}
Другие вопросы по тегам