Трунов
Д.Н.
Примечания к статье «О некоторых изменениях в
криптографических алгоритмах ESCK-5 и CSA-2»
В статье «О некоторых изменениях в
криптографических алгоритмах ESCK-5
и CSA-2»
были рассмотрены изменения упомянутых алгоритмов, которые практически не
затрагивали результатов их работы. Для алгоритма криптографической подписи CSA-2 этого было достаточно, однако в
алгоритме шифрования ESCK-5
из-за особенностей режимов шифрования и работы с неполными блоками были
выявлены недостатки, устранение которых кардинально влияет на результаты
вычисления.
Главный недостаток обнаружен в функциях
одного раунда шифрования и расшифровки (Enc и
Dec)
в части определения величин A,
B
и
C
(в самом начале основного цикла). В прежнем варианте допускались ситуации,
когда величины B
и
C
оказывались достоверно одинаковыми, что ослабляло надёжность шифрования. Ниже
приведён фрагмент прежнего кода на языке C#:
// получение текущего и следующего
элементов ключа или массива
A =
K[I];
Adr = (uint)(I + 1);
if (Adr > 255)
Adr = Adr &
0xFF;
B = K[Adr];
if (Adr > Size)
C = K[Adr];
else
C = M[Adr];
Алгоритм был изменён так, чтобы величина
C
во
всех случаях бралась из источника, отличного от источника величины B. Ниже приведён фрагмент исправленного
кода:
// получение
текущего элемента ключа
A = K[I];
// получение
следующего элемента ключа
Adr = (uint)(I
+ 1);
if (Adr > 255)
Adr = Adr &
0xFF;
B = K[Adr];
// следующий
элемент из рабочего массива, если не выходит за пределы
if (Adr
> Size)
{
// если выходит за пределы, взять следующий элемент ключа
Adr++;
if (Adr > 255)
Adr = Adr
& 0xFF;
C = K[Adr];
}
else
C = M[Adr];
Кроме того, была исправлена функция
шифрования файла EncryptFile
в
части определения размера для записи. За счёт возможного добавления
дополнительных ячеек размер записываемых данных может превышать размер
шифруемых. Очень важно правильно вычислить этот размер, иначе могут возникнуть
ошибки при расшифровке некорректно записанных в файл данных.
В прежней версии ошибочно дописывались
лишние 16 байт, если включен режим mdMin16 и одновременно последний блок является полным
(или включен режим mdStr,
дополняющий неполный блок до полного). Ниже приведён фрагмент упомянутого кода:
// определение размера для записи
J = (uint)BufSz;
if ((J & 3) != 0)
J = ((J >> 2) + 1) << 2;
if (((J % 1024) != 0) && ((Mode & mdStr)
!= 0))
J = ((J
>> 10) + 1) << 10;
if (((J % 1024) < 16) && ((Mode &
mdMin16) != 0))
J = ((J >> 4) + 1) << 4;
В новой версии такая ситуация
исключалась с помощью проверки (J % 1024) != 0
не только в режиме mdStr,
но и mdMin16.
Если размер неполного блока равен нулю, значит, все блоки полные и никакое
удлинение не требуется. Ниже приведён фрагмент исправленного кода:
// определение
размера для записи
J = (uint)BufSz;
if ((J & 3) != 0)
J = ((J
>> 2) + 1) << 2;
if (((J % 1024) != 0) && ((Mode & mdStr)
!= 0))
J = ((J
>> 10) + 1) << 10;
if (((J % 1024) != 0) &&((J % 1024) < 16)
&& ((Mode & mdMin16) != 0))
J = ((J >> 4) + 1)
<< 4;
В заключение следует отметить, что все
изменения касаются только алгоритма шифрования ESCK-5 и никак не влияют на алгоритм
криптографической подписи CSA-2,
оставшийся без изменений.