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