RFC 1319 The MD2 Message-Digest Algorithm

Network Working Group                                         B. Kaliski
Request for Comments: 1319                              RSA Laboratories
Updates: RFC 1115                                             April 1992

The MD2 Message-Digest Algorithm

Алгоритм MD2 для дайджестов сообщений

PDF

Статус документа

Документ является информационным, не содержит стандартов Internet и может распространяться без ограничений.

Благодарности

Описание MD2 основано на материалах Джона Линна (John Linn) и Рона Ривеста (Ron Rivest). Спасибо им за разрешение использовать эти материалы.

1. Введение

В этом документе описывается алгоритм цифровых подписей1 MD2. Этот алгоритм принимает на входе сообщение произвольного размера и выдаёт в результате 128-битовый «отпечаток» (fingerprint) или цифровую подпись (message digest). Предполагается, что потребуется нереальный объем вычислений для создания двух сообщений, цифровые подписи которых совпадут, или подбора сообщения по имеющейся цифровой подписи. Алгоритм MD2 предназначен для создания цифровой подписи (сигнатуры), когда требуется безопасно «сжать» большой файл перед тем, как шифровать его с использованием закрытого (секретного) ключа в системах с открытым ключом, таких как RSA.

октябре 1990 документ RFC 1186 [2]. Основное отличие между документами заключается в том, что представленный здесь вариант реализации MD4 является более переносимым.

Предоставляется лицензия на некоммерческое использование MD2 в электронной почте Internet Privacy-Enhanced Mail [1-3].

Данный документ заменяет выпущенный в августе 1989 г. RFC 1115 [3], где тоже представлена эталонная реализация MD2. Основное отличие между документами заключается в том, что представленный здесь вариант реализации MD2 является более переносимым.

Для приложений OSI идентификатор объекта MD2 имеет форму

   md2 OBJECT IDENTIFIER ::=
   iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 2}

В идентификаторе типа X.509 (AlgorithmIdentifier [4]) параметры для MD2 должны иметь тип NULL.

2. Термины и обозначения

В этом документе термин «байт» (byte) обозначает 8-битовую величину (значение).

Запись x_i означает x i-ое (x[i]). Если индекс представляет собой выражение, оно будет заключаться в фигурные скобки x_{i+1}. Символ ^ используется для обозначения возведения в степень — x^i означает x в степени i.

Запись X xor Y означает побитовую операцию X XOR Y (исключающее ИЛИ)

3. Описание алгоритма MD2

Начнём с допущения о наличии на входе сообщения размером b битов, для которого нужно создать цифровую подпись. Здесь b означает неотрицательное целое число, которок может принимать нулевое значение и не обязано быть кратным 8. Это значение может быть неограниченно большим. Биты исходного сообщения будем представлять следующим образом:

m_0 m_1 ... m_{b-1}

Для создания цифровой подписи выполняется процесс из 5 описанных ниже этапов.

3.1 Этап 1. Добавление в конце байтов заполнения

Сообщение дополняется (расширяется) до размера (в байтах), конгруэнтного 0 по модулю 16. Т. е., после добавления размер сообщения в байтах становится кратным 16. Заполнение производится во всех случаях, даже если размер исходного сообщения конгруэнтен 0 по модулю 16.

Дополнение происходит следующим образом: сначала в конце сообщения добавляется i байтов со значением i, чтобы размер дополненного сообщения в байтах стал конгруэнтным 0 по модулю 16. Добавляется не менее 1 и не более 16 байтов.

Таким образом, после дополнения байтами размер сообщения в байтах становится кратным 16. Пусть M[0 … N-1] — байты дополненного сообщения, где N кратно 16.

3.2 Этап 2. Добавление в конце контрольной суммы

В конце результата предыдущего этапа добавляется 16-байтовая контрольная сумма сообщения. На этом этапе применяется «случайная» 256-байтовая перестановка из цифра числа пи. Пусть S[i] обозначает i-й элемент таблицы перестановок, приведённой в приложении A. Расчёт контрольной суммы показан ниже.

      /* Очистка значения контрольной суммы */
      For i = 0 to 15 do:
         Set C[i] to 0.
      end /* цикл по i */

      Set L to 0.

      /* Обработка каждого блока из 16 байтов2. */
      For i = 0 to N/16-1 do
         /* Контрольная сумма блока i. */
         For j = 0 to 15 do
            Set c to M[i*16+j].
            Set C[j] to S[c xor L].
            Set L to C[j].
          end /* цикл по j */
       end /* цикл по i */

16-байтовая контрольная сумма C[0 … 15] добавляется в конец дополненного на этапе 1 сообщения. Пусть M[0..N’-1] — сообщение с байтами дополнения и контрольной суммой, N’ = N + 163.

3.3 Этап 3. Инициализация буфера MD

Для расчёта дайджеста сообщения используется 48-байтовый буфер X, инициализируемый нулями.

3.4 Этап 4. Обработка сообщения 16-байтовыми блоками

На этом этапе применяется такая же 256-байтовая перестановка S, как на этапе 2.

      /* Обработка каждого блока из 16 байтов4. */
      For i = 0 to N'/16-1 do
         /* Копирование блока i в буфер X. */
         For j = 0 to 15 do
            Set X[16+j] to M[i*16+j].
            Set X[32+j] to (X[16+j] xor X[j]).
          end /* цикл по j */

         Set t to 0.

         /* 18 раундов обработки. */
         For j = 0 to 17 do
            /* Раунд j. */
            For k = 0 to 47 do
               Set t and X[k] to (X[k] xor S[t]).
            end /* цикл по k */

            Set t to (t+j) modulo 256.
         end /* цикл по j */
      end /* цикл по i */

3.5 Этап 5. Вывод

Дайджест сообщения выводится как X[0 … 15], начиная с X[0] и заканчивая X[15].

На этом расчёт MD2 завершается. Эталонная реализация на языке C представлена в Приложении A.

4. Заключение

Алгоритм создания дайджеста сообщений MD2 просто в реализации и предоставляет «оттиск» (fingerprint) или дайджест сообщения произвольной длины. Предполагается, что для нахождения двух сообщений с одинаковым дайджестом потребуется порядка 2^64 операций, а для создания сообщения по заданному дайджесту — порядка 2^128 операций. Алгоритм MD2 был тщательно исследован на предмет уязвимостей и дальнейший анализ его безопасности, несомненно, оправдан, как и для любого нового предложения такого сорта.

Литература

[1] Linn, J., «Privacy Enhancement for Internet Electronic Mail: Part I — Message Encipherment and Authentication Procedures», RFC 1113, DEC, IAB Privacy Task Force, August 1989.

[2] Kent, S., and J. Linn, «Privacy Enhancement for Internet Electronic Mail: Part II — Certificate-Based Key Management», RFC 1114, BBNCC, DEC, IAB Privacy Task Force, August 1989.

[3] Linn, J., «Privacy Enhancement for Internet Electronic Mail: Part III — Algorithms, Modes, and Identifiers», RFC 1115 DEC, IAB Privacy Task Force, August 1989.

[4] CCITT Recommendation X.509 (1988), «The Directory — Authentication Framework».

Приложение A — Эталонная реализация

В это приложение включены файлы, взятые из RSAREF: A Cryptographic Toolkit for Privacy-Enhanced Mail:

        global.h – общий файл заголовков
        md2.h – файл заголовков для MD2
        md2c.c – исходный код реализации MD2

Для получения дополнительной информации от RSAREF следует писать по адресу <rsaref@rsa.com>.

Приложение также включает файл The appendix also includes the following file:

        mddriver.c – тестовый драйвер для MD2, MD4 и MD5

Драйвер по умолчанию компилируется для проверки MD5 и может быть скомпилирован для проверки MD2 или MD4, если в командной строке компилятора C задать для MD значение 2 или 4, соответственно.

A.1 global.h

/* GLOBAL.H – типы и константы RSAREF */

/* Для PROTOTYPES следует использовать значение 1 тогда и только тогда, 
   когда компилятор поддерживает прототипы аргументов в функциях. 
   Приведённый ниже код устанавливает для PROTOTYPES по умолчанию 
   значение 0, если этот параметр уже не задан флагами компилятора C.
 */
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

/* POINTER определяет базовый тип указателя */
typedef unsigned char *POINTER;

/* UINT2 определяет 2-байтовое слово */
typedef unsigned short int UINT2;

/* UINT4 определяет 4-байтовое слово */
typedef unsigned long int UINT4;

/* PROTO_LIST определяется в зависимости от определённого ранее 
   значения PROTOTYPES. При использовании PROTOTYPES список PROTO_LIST 
   будет возвращать прототипы, иначе будет пустым.
 */
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

A.2 md2.h

/* MD2.H - заголовочный файл для MD2C.C */

/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
   rights reserved.

   License to copy and use this software is granted for
   non-commercial Internet Privacy-Enhanced Mail provided that it is
   identified as the "RSA Data Security, Inc. MD2 Message Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */


typedef struct {
  unsigned char state[16];            /* состояние */
  unsigned char checksum[16];         /* контрольная сумма */
  unsigned int count;                 /* число байтов, модуль 16 */
  unsigned char buffer[16];           /* входной буфер */
} MD2_CTX;

void MD2Init PROTO_LIST ((MD2_CTX *));
void MD2Update PROTO_LIST
  ((MD2_CTX *, unsigned char *, unsigned int));
void MD2Final PROTO_LIST ((unsigned char [16], MD2_CTX *));

A.3 md2c.c

/* MD2C.C - RSA Data Security, Inc., алгоритм дайджеста сообщения MD2
 */

/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
   rights reserved.

   License to copy and use this software is granted for
   non-commercial Internet Privacy-Enhanced Mail provided that it is
   identified as the "RSA Data Security, Inc. MD2 Message Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

#include "global.h"
#include "md2.h"

static void MD2Transform PROTO_LIST
  ((unsigned char [16], unsigned char [16], unsigned char [16]));
static void MD2_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
static void MD2_memset PROTO_LIST ((POINTER, int, unsigned int));

/* Перестановка 0..255 из цифр числа пи, дающая "случайную" нелинейную
   подстановку байтов.
 */
static unsigned char PI_SUBST[256] = {
  41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
  19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
  76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
  138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
  245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
  148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
  39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
  181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
  150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
  112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
  96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
  85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
  234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
  129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
  8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
  203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
  166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
  31, 26, 219, 153, 141, 51, 159, 17, 131, 20
};

static unsigned char *PADDING[] = {
  (unsigned char *)"",
  (unsigned char *)"\001",
  (unsigned char *)"\002\002",
  (unsigned char *)"\003\003\003",
  (unsigned char *)"\004\004\004\004",
  (unsigned char *)"\005\005\005\005\005",
  (unsigned char *)"\006\006\006\006\006\006",
  (unsigned char *)"\007\007\007\007\007\007\007",
  (unsigned char *)"\010\010\010\010\010\010\010\010",
  (unsigned char *)"\011\011\011\011\011\011\011\011\011",
  (unsigned char *)"\012\012\012\012\012\012\012\012\012\012",
  (unsigned char *)"\013\013\013\013\013\013\013\013\013\013\013",
  (unsigned char *)"\014\014\014\014\014\014\014\014\014\014\014\014",
  (unsigned char *)
    "\015\015\015\015\015\015\015\015\015\015\015\015\015",
  (unsigned char *)
    "\016\016\016\016\016\016\016\016\016\016\016\016\016\016",
  (unsigned char *)
    "\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017",
  (unsigned char *)
    "\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020"
};

/* Инициализация MD2. Начинает работу MD2, записывая новый контекст.
 */
void MD2Init (context)
MD2_CTX *context;                                        /* Контекст */
{
  context->count = 0;
  MD2_memset ((POINTER)context->state, 0, sizeof (context->state));
  MD2_memset
    ((POINTER)context->checksum, 0, sizeof (context->checksum));
}

/* Операция обновления блока MD2. Продолжает работу MD2, обрабатывая
   другой блок сообщения и обновляя контекст.
 */
void MD2Update (context, input, inputLen)
MD2_CTX *context;                          /* Контекст */
unsigned char *input;                      /* Входной блок */
unsigned int inputLen;                     /* Размер входного блока */
{
  unsigned int i, index, partLen;

  /* Update number of bytes mod 16 */
  index = context->count;
  context->count = (index + inputLen) & 0xf;

  partLen = 16 - index;

  /* Преобразование максимально возможное число раз.
    */
  if (inputLen >= partLen) {
    MD2_memcpy
      ((POINTER)&context->buffer[index], (POINTER)input, partLen);
    MD2Transform (context->state, context->checksum, context->buffer);

    for (i = partLen; i + 15 < inputLen; i += 16)
      MD2Transform (context->state, context->checksum, &input[i]);

    index = 0;
  }
  else
    i = 0;

  /* Остаток входных данных в буфере */
  MD2_memcpy
    ((POINTER)&context->buffer[index], (POINTER)&input[i],
     inputLen-i);
}

/* Завершение работы MD2. Окончание создания дайджеста MD2, вывод
   дайджеста и сброс (обнуление) контекста.
 */
void MD2Final (digest, context)
unsigned char digest[16];                       /* Дайджест сообщения */
MD2_CTX *context;                               /* Контекст */
{
  unsigned int index, padLen;

  /* Дополнение до размера, кратного 16.
   */
  index = context->count;
  padLen = 16 - index;
  MD2Update (context, PADDING[padLen], padLen);

  /* Добавление контрольной суммы */
  MD2Update (context, context->checksum, 16);

  /* Сохранение состояния в дайджесте */
  MD2_memcpy ((POINTER)digest, (POINTER)context->state, 16);

  /* Обнуление деликатных данных.
   */
  MD2_memset ((POINTER)context, 0, sizeof (*context));
}

/* Базовое преобразование MD2. Трансформирует состояние и обновляет
   контрольную сумму на основе блока.
 */
static void MD2Transform (state, checksum, block)
unsigned char state[16];
unsigned char checksum[16];
unsigned char block[16];
{
  unsigned int i, j, t;
  unsigned char x[48];

  /* Создание блока шифрования из state, block, state ^ block.
   */
  MD2_memcpy ((POINTER)x, (POINTER)state, 16);
  MD2_memcpy ((POINTER)x+16, (POINTER)block, 16);
  for (i = 0; i < 16; i++)
    x[i+32] = state[i] ^ block[i];

  /* Шифрование блока (18 раундов).
   */
  t = 0;
  for (i = 0; i < 18; i++) {
    for (j = 0; j < 48; j++)
      t = x[j] ^= PI_SUBST[t];
    t = (t + i) & 0xff;
  }

  /* Сохранение нового состояния */
  MD2_memcpy ((POINTER)state, (POINTER)x, 16);

  /* Обновление контрольной суммы. */
  t = checksum[15];
  for (i = 0; i < 16; i++)
    t = checksum[i] ^= PI_SUBST[block[i] ^ t];

  /* Обнуление деликатных данных. */
  MD2_memset ((POINTER)x, 0, sizeof (x));
}

/* По возможности следует заменить цикл for на стандартную команду memcpy
 */
static void MD2_memcpy (output, input, len)
POINTER output;
POINTER input;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)
    output[i] = input[i];
}

/* По возможности следует заменить цикл for на стандартную команду memcpy
 */
static void MD2_memset (output, value, len)
POINTER output;
int value;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)
    ((char *)output)[i] = (char)value;
}

A.4 mddriver.c

/* MDDRIVER.C – тест-драйвер для MD2, MD4 и MD5 */

/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
   rights reserved.

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

/* Включенное ниже определение по умолчанию обеспечивает проверку MD5, 
   если флаги компилятора C не задают иного.
 */
#ifndef MD
#define MD MD5
#endif

#include <stdio.h>
#include <time.h>
#include <string.h>
#include "global.h"
#if MD == 2
#include "md2.h"
#endif
#if MD == 4
#include "md4.h"
#endif
#if MD == 5
#include "md5.h"
#endif

/* Размер и число тестовых блоков. */
#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000

static void MDString PROTO_LIST ((char *));
static void MDTimeTrial PROTO_LIST ((void));
static void MDTestSuite PROTO_LIST ((void));
static void MDFile PROTO_LIST ((char *));
static void MDFilter PROTO_LIST ((void));
static void MDPrint PROTO_LIST ((unsigned char [16]));

#if MD == 2
#define MD_CTX MD2_CTX
#define MDInit MD2Init
#define MDUpdate MD2Update
#define MDFinal MD2Final
#endif
#if MD == 4
#define MD_CTX MD4_CTX
#define MDInit MD4Init
#define MDUpdate MD4Update
#define MDFinal MD4Final
#endif
#if MD == 5
#define MD_CTX MD5_CTX
#define MDInit MD5Init
#define MDUpdate MD5Update
#define MDFinal MD5Final
#endif

/* Драйвер.
Аргументы (допускаются любые комбинации):
  -sstring – строка сигнатур
  -t       - определять время 
  -x       - использовать тестовый сценарий
  filename – файл сигнатур
  (none)   - стандартный ввод для сигнатур
 */
int main (argc, argv)
int argc;
char *argv[];
{
  int i;

  if (argc > 1)
    for (i = 1; i < argc; i++)
      if (argv[i][0] == '-' && argv[i][1] == 's')
        MDString (argv[i] + 2);
      else if (strcmp (argv[i], "-t") == 0)
        MDTimeTrial ();
      else if (strcmp (argv[i], "-x") == 0)
        MDTestSuite ();
      else
        MDFile (argv[i]);
  else
    MDFilter ();

  return (0);
}

/* Создает и выводит строку дайджеста. */
static void MDString (string)
char *string;
{
  MD_CTX context;
  unsigned char digest[16];
  unsigned int len = strlen (string);

  MDInit (&context);
  MDUpdate (&context, string, len);
  MDFinal (digest, &context);

  printf ("MD%d (\"%s\") = ", MD, string);
  MDPrint (digest);
  printf ("\n");
}

/* Измерение времени создания дайджеста для TEST_BLOCK_COUNT блоков
   по TEST_BLOCK_LEN байтов. */
 */
static void MDTimeTrial ()
{
  MD_CTX context;
  time_t endTime, startTime;
  unsigned char block[TEST_BLOCK_LEN], digest[16];
  unsigned int i;

  printf
    ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
     TEST_BLOCK_LEN, TEST_BLOCK_COUNT);

  /* Инициализация блока */
  for (i = 0; i < TEST_BLOCK_LEN; i++)
    block[i] = (unsigned char)(i & 0xff);

  /* Запуск таймера */
  time (&startTime);

  /* Блоки дайджеста */
  MDInit (&context);
  for (i = 0; i < TEST_BLOCK_COUNT; i++)
    MDUpdate (&context, block, TEST_BLOCK_LEN);
  MDFinal (digest, &context);

  /* Отсановка таймера */
  time (&endTime);

  printf (" done\n");
  printf ("Digest = ");
  MDPrint (digest);
  printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
  printf
    ("Speed = %ld bytes/second\n",
     (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
}
/* Создаёт дайджесты тестовых строк и выводит результаты. */
static void MDTestSuite ()
{
  printf ("MD%d test suite:\n", MD);

  MDString ("");
  MDString ("a");
  MDString ("abc");
  MDString ("message digest");
  MDString ("abcdefghijklmnopqrstuvwxyz");
  MDString
    ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
  MDString
    ("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}

/* Создаёт и выводит дайджест файла. */
static void MDFile (filename)
char *filename;
{
  FILE *file;
  MD_CTX context;
  int len;
  unsigned char buffer[1024], digest[16];

  if ((file = fopen (filename, "rb")) == NULL)
    printf ("%s can't be opened\n", filename);

  else {
    MDInit (&context);
    while (len = fread (buffer, 1, 1024, file))
      MDUpdate (&context, buffer, len);
    MDFinal (digest, &context);

    fclose (file);

    printf ("MD%d (%s) = ", MD, filename);
    MDPrint (digest);
    printf ("\n");
  }
}

/* Создает дайджест данных со стандартного ввода и выводит результат. */
static void MDFilter ()
{
  MD_CTX context;
  int len;
  unsigned char buffer[16], digest[16];

  MDInit (&context);
  while (len = fread (buffer, 1, 16, stdin))
    MDUpdate (&context, buffer, len);
  MDFinal (digest, &context);

  MDPrint (digest);
  printf ("\n");
}

/* Выводит дайджест сообщения в шестнадцатеричном формате. */
static void MDPrint (digest)
unsigned char digest[16];
{
  unsigned int i;

  for (i = 0; i < 16; i++)
    printf ("%02x", digest[i]);
}

A.5 Набор тестов

Тест MD2 (опция драйвера -x) должен давать на выход представленные ниже строки:

MD2 test suite:
MD2 ("") = 8350e5a3e24c153df2275c9f80692773
MD2 ("a") = 32ec01ec4a6dac72c0ab96fb34c0b5d1
MD2 ("abc") = da853b0d3f88d99b30283a69e6ded6bb
MD2 ("message digest") = ab4f496bfb2a530b219ff33031fe06b0
MD2 ("abcdefghijklmnopqrstuvwxyz") = 4e8ddff3650292ab5a4108c3aa47940b
MD2 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
da33def2a42df13975352846c30338cd
MD2 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = d5976f79d83d3a0dc9806c3c66f3efd8

Вопросы безопасности

Уровень безопасности, рассматриваемый в документе, считается достаточным для реализации схем гибридной цифровой подписи с очень высокой защищенностью на основе MD2 и криптосистемы с открытым ключом.

Адрес автора

Burton S. Kaliski Jr.

RSA Laboratories (a division of RSA Data Security, Inc.)

10 Twin Dolphin Drive

Redwood City, CA 94065

Phone: (415) 595-8782

FAX: (415) 595-4126

EMail: burt@rsa.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Message-digest algorithm.

2В оригинале ошибочно сказано «16 слов», см. https://errata.rfc-editor.org/eid3575/. Прим. перев.

3В оригинале этот абзац содержал ошибку, см. https://errata.rfc-editor.org/eid555/. Прим. перев.

4В оригинале ошибочно сказано «16 слов», см. https://errata.rfc-editor.org/eid3576/. Прим. перев.

Запись опубликована в рубрике RFC. Добавьте в закладки постоянную ссылку.

Добавить комментарий