Реализации алгоритмов/RC5: различия между версиями

Использован {{BookCat}}; пробелы; →‎К переименованию: снят шаблон после переименования.
м (Ivan Shmakov переименовал страницу Программные реализации RC5 в Реализации алгоритмов/RC5: Согласно [[Викиучебник:К переименованию/Ноябрь 2014…)
(Использован {{BookCat}}; пробелы; →‎К переименованию: снят шаблон после переименования.)
{{К переименованию |2014-11-21|Реализации алгоритмов/RC5}}
 
== На языке [[w:C#|C#]] ==
В данной реализации используется размер слова ''W'' = 64 бита, что соответствует размеру блока в 128 бит. Число раундов ''R'' = 16. Ключ ''K'' определяется пользователем самостоятельно.
public class RC5
{
const int W = 64; // половина длины блока в битах.
// Возможные значения 16, 32 и 64.
// Для эффективной реализации величину W
// рекомендуют брать равным машинному слову.
// Например, для 64-битных платформ оптимальным будет
// выбор W=64, что соответствует размеру блока в 128 бит.
 
const int R = 16; // число раундов. Возможные значения 0…255.
// Увеличение числа раундов обеспечивает увеличение
// уровня безопасности шифра. Так, если R = 0,
// то информация шифроваться не будет.
 
const UInt64 PW = 0xB7E151628AED2A6B; // 64-битная константа
const UInt64 QW = 0x9E3779B97F4A7C15; // 64-битная константа
 
UInt64[] L; // массив слов для секретного ключа пользователя
UInt64[] S; // таблица расширенных ключей
public RC5(byte[] key)
{
/*
* Перед непосредственно шифрованием или расшифровкой данных выполняется процедура расширения ключа.
* Процедура генерации ключа состоит из четырех этапов:
int i, j, n;
 
/*
* Этап 1. Генерация констант
* Для заданного параметра W генерируются две псевдослучайные величины,
* Pw = Odd((f - 1) * 2^W;
* где Odd() - это округление до ближайшего нечетного целого.
*
* Для оптимизации алгоритмы эти 2 величины определены заранее (см. константы выше).
*/
* Этап 2. Разбиение ключа на слова
* На этом этапе происходит копирование ключа K[0]..K[255] в массив слов L[0]..L[c-1], где
* c = b/u, а u = W/8. Если b не кратен W/8, то L[i] дополняется нулевыми битами до ближайшего
* большего размера c, при котором длина ключа b будет кратна W/8.
*/
c = b % u > 0 ? b / u + 1 : b / u;
L = new UInt64[c];
 
for (i = b - 1; i >= 0; i--)
{
 
/* Этап 3. Построение таблицы расширенных ключей
* На этом этапе происходит построение таблицы расширенных ключей S[0]..S[2(R + 1)],
* которая выполняется следующим образом:
*/
UInt64 a = BytesToUInt64(inBuf, 0);
UInt64 b = BytesToUInt64(inBuf, 8);
 
a = a + S[0];
b = b + S[1];
UInt64 a = BytesToUInt64(inBuf, 0);
UInt64 b = BytesToUInt64(inBuf, 8);
 
for (int i = R; i > 0; i--)
{
</source>
 
{{BookCat}}
[[Категория:Программирование]]
3890

правок