Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - RC6 - Реализация алгоритма RC6 на языке C#14 июня 2011Оглавление: 1. RC6 2. Детали RC6 3. Шифрование и расшифрование 4. Реализация алгоритма RC6 на языке C# 5. Безопасность 6. Оценка аппаратных средств 7. Выполнение 8. Лицензирование В данной реализации используется размер слова W = 64 бита, что соответствует размеру блока в 128 бит. Число раундов R = 16. Ключ K определяется пользователем самостоятельно.
using System;
using System.IO;
using System.Collections.Generic;
namespace RC6
{
class RC6
{
// Константы для операций свига
public const int W = 32;
public const int R = 16;
// Переменные для работы с файлами
public Byte fileData;
public uint fileLength;
// Список расшифрованных / рашифрованных данных
public List<Byte> resultData = new List<Byte>;
// Крипто-ключ
public UInt32 key = new UInt32;
// Функция записи данных в файл
public void WriteByteArrayToFile
{
try
{
FileStream fs = new FileStream;
BinaryWriter bw = new BinaryWriter;
for
bw.Write;
bw.Close;
fs.Close;
}
catch
{
// Опущено для реализации под различными типами проектов
}
}
// Функция чтения данных из файла
public Byte ReadByteArrayFromFile
{
Byte buffer = null;
try
{
FileStream fs = new FileStream;
BinaryReader br = new BinaryReader;
long numBytes = new FileInfo.Length;
buffer = br.ReadBytesnumBytes);
br.Close;
fs.Close;
}
catch
{
// Опущено для реализации под различными типами проектов
}
return buffer;
}
// Функция сдвига вправо
public UInt32 RightShift
{
return | ));
}
// Функция сдвига влево
public UInt32 LeftShift
{
return | ));
}
// Функция определения числа сдвигов
public int OffsetAmount
{
int nLgw = W) / Math.Log);
dwVar = dwVar << ;
dwVar = dwVar >> ;
return dwVar;
}
// Функция генерации ключа
public void KeyGen
{
UInt32 P32 = 0xB7E15163;
UInt32 Q32 = 0x9E3779B9;
UInt32 i, A, B;
UInt32 dwByteOne, dwByteTwo, dwByteThree, dwByteFour;
dwByteOne = dwKey >> 24;
dwByteTwo = dwKey >> 8;
dwByteTwo = dwByteTwo & 0x0010;
dwByteThree = dwKey << 8;
dwByteThree = dwByteThree & 0x0100;
dwByteFour = dwKey << 24;
dwKey = dwByteOne | dwByteTwo | dwByteThree | dwByteFour;
key = P32;
for
key = key + Q32;
i = A = B = 0;
int v = 3 * Math.Max;
for
{
A = key = LeftShift);
B = dwKey = LeftShift));
i = % ;
}
}
// Функция преобразования массива UInt32 к списку байт
public void ConvertFromUInt32ToByteArray
{
List<byte> results = new List<byte>;
foreach
{
byte converted = BitConverter.GetBytes;
results.AddRange;
}
// Формирование списка зашифрованных / расшифрванных байт данных
resultData.AddRange;
}
// Функия преобразования массива байт в массив UInt32
public UInt32 ConvertFromByteArrayToUIn32
{
List<UInt32> results = new List<UInt32>;
// Размер блока конвертируемых данных. Читаем по 16 байт.
int length = position + 16;
for
{
byte temp = new byte;
for
{
if
temp = array;
else
temp = 0x00; // заполняем недостающие блоки в случае достижения
// конца файла
}
results.Add);
}
return results.ToArray;
}
// Функция расшифровки файла
public void DecodeFile
{
UInt32 pdwTemp;
for
{
pdwTemp = ConvertFromByteArrayToUIn32;
pdwTemp = ;
pdwTemp = ;
for
{
UInt32 t = LeftShift),
OffsetAmountW) / Math.Log)));
UInt32 u = LeftShift),
OffsetAmountW) / Math.Log)));
pdwTemp = u)) + key);
pdwTemp = t)) + key);
UInt32 temp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = temp;
}
pdwTemp = ;
pdwTemp = ;
// Конвертируем в выходной массив расшифрованных данных
ConvertFromUInt32ToByteArray;
}
pdwTemp = null;
}
// Функция шифрования файла
public void EncodeFile
{
UInt32 pdwTemp;
for
{
pdwTemp = ConvertFromByteArrayToUIn32;
pdwTemp = ;
pdwTemp = ;
for
{
UInt32 temp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = pdwTemp;
pdwTemp = temp;
UInt32 t = LeftShift),
OffsetAmountW) / Math.Log)));
UInt32 u = LeftShift),
OffsetAmountW) / Math.Log)));
pdwTemp = , OffsetAmountu))) ^ t;
pdwTemp = , OffsetAmountt))) ^ u;
}
pdwTemp = ;
pdwTemp = ;
// Конвертируем в выходной массив зашифрованных данных
ConvertFromUInt32ToByteArray;
}
pdwTemp = null;
}
}
}
Просмотров: 11322
|