Рейтинг:1

Camellia 1.2.0: слова с 0 в ключевой таблице

флаг co

Тестирование кода, использующего Camellia 1.2.0 исходный код, при создании keyTable из входного ключа, используя:

void Camellia_Ekeygen (const int keyBitLength, 
          константный символ без знака *rawKey, 
          KEY_TABLE_TYPE ключевая таблица)

Вывод показывает несколько «обнуленных» слов в одних и тех же местах. Два случайных примера для 256 бит:

Э1АЭ67Э4 07АЭ952Б 94Б0ФКД1 КД366Э1К 5160Ф1А8 45893АЭ8 0994ЭК20 1Б5782АФ

52027468 Д2СЕБ8Ф 00000000 00000000 5А44Д15Д 533Ф0ЭФ8 Э441183Ф 960616КЭ
Б492Э69К К71899ДБ 1К149А9Э ДА2ЭФ3Ф9 К590ДФ1Д 8ЭКЭ1АА3 5БФ4К76А 517А719Б
БА4Э6211 083Б6502 АБЭ0Д506 6А3К58Д4 32Б152А6 К7Д2АД48 2338ФК75 4Б1К4805
6FB9B4E4 4E14DA25 46CEF6AA D655F3C1 E89A9073 87CCF090 098D9E8F C73283B7
КД0Ф4ББ9 Э166Д31К 7ЭЭ61АСЕ 52Э97А40 0Ф5Б9Э82 4Ф98АЭДЭ 91Д08211 2Э660Д02
01506Ф57 40Ф9Э4БА К2АБ1164 196А9ДЭ8 6Э870140 К0А16094 Ф462Э486 Д98ФФ34Ф
Ф8543532 5ACAA32E 0046EFC7 06E9A0B9 42409189 9D9C0A16 EF580EC8 03E52B67
4D99620A B6A40197 3999A1B9 A9B45F27 6AE83BF0 7351AF36 6AEDF2EC 0A050076
B50EBD28 B9A2B34C 00000000 00000000


БЭ276А07 021К223Ф 40262К4Б 2Б07Д216 АБ51К522 К919К184 ББАД4565 Б3050К87

93759D00 1DCE4C1F 00000000 00000000 91C6EBE1 47BE73E0 A1ECCAB9 B997E1E5
ДЭБ11931 К13К15Д2 ЭА9Э2Б5Б 892БК368 БФД5Ф521 7Б61Б763 КБ8К58Б7 0АЭ271Ф1
617046Б2 5951ЭБ2Э 2143К16К 4871Д4ЭА 8АА8Э801 3КД1Э79Э Д64Б23Ф5 ДА983076
Д6232073 5364БДЭ7 77ФФЭ6АЭ Б967ФДЭ4 ФДД26694 1720ЭКФ0 6ФК56ЭЭЭ 3Б618822
К46202Ф4 217ДБ0Б2 А076Э26Б 23К22170 АД07К5Э8 890АЭ608 ЭФК78526 Ф0Ф62449
7C712F1A D7CC710B C0FDB367 E97D2186 437CA739 F93D0CBF C90FF6E2 C879AA2B
511Б3КФ8 2Э25К89Э 7Б745Э74 КА705ККЭ 3ДФД612Д 1БЭ56472 ФА45Э7ЭА 4Б3Б85Б0
95F84DCF 4C14FC95 20310BF7 A353A328 0E505958 A56CB1A1 007D2357 CC0239C8
4EFF9C31 2B9BEF19 00000000 00000000

Ожидается ли это?

Уточнение: приведенные выше «шестнадцатеричные» дампы показывают два вызова функции. Для каждого keyBitLength установлено значение 256, более короткая последовательность (которая помещается в одну строку) представляет собой случайный 256-битный ключ, а за ним следует вывод функции (скопированный в буфер keyTable).

Еще один тест: я обнулял keyTable перед вызовом функции. Теперь я установил все байты как 0xFF, а обнуленные слова стали: 0xFFFFFFFF. Страшный. Эти слова (всегда одни и те же) не затрагиваются функцией.

Попробуйте решить, используя стандартные типы. Я также переключился на компиляцию -O0, чтобы избежать проблем с оптимизацией:

// typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
/* u32 должно быть 32-битным словом */
// typedef unsigned int u32;
// typedef unsigned char u8;

#include <stdint.h> // это единственное изменение исходного кода (сохранено выше):
typedef uint32_t KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
typedef uint32_t u32;
typedef uint8_t u8;

Я загрузил минимальную тестовую программу здесь.

DannyNiu avatar
флаг vu
Предполагается, что исходный код `long` является 32-битным, что может быть неверно для 64-битных систем. Попробуйте заменить определение типа Word на uint32_t в начале исходного кода.
devnull avatar
флаг co
@ДэнниНиу. Спасибо. Я попробовал это и обновил вопрос (без изменений). Я также снова загрузил исходный код и выделил «минимальную» тестовую программу, которая воспроизводима для меня (687 строк кода). Должен ли я загрузить его здесь?
Maarten Bodewes avatar
флаг in
Это может быть слишком много, но вы, конечно, можете поместить это где-нибудь, где разрешены фрагменты кода, и поместить ссылку в вопрос.Лично я бы попробовал другой код, который легко скомпилировать (например, Bouncy Castle/Java), а затем попытался проверить сгенерированные вами значения. Различия, такие как нулевые значения и т. д., должны быть легко обнаружены.
Maarten Bodewes avatar
флаг in
Тьфу, для всех, кто идет по этому пути, BC указывает RFC 3713. Я вообще не получаю одинаковых значений, я думаю, одно — это v1, а другое — v2 шифра Camelia. Вздох, это подходит для другого вопроса, я полагаю.
devnull avatar
флаг co
@MaartenBodewes Я только что скачал asm-версию x86_64 с той же страницы (первая ссылка вверху), и она генерирует совершенно другую таблицу ключей (также без 4 неиспользуемых слов). Я отправил электронное письмо на контактный адрес на той же странице и сообщу здесь о любом соответствующем ответе.
Maarten Bodewes avatar
флаг in
Я надеюсь, что вы получите ответ, иногда сложно получить ответы из Японии :)
devnull avatar
флаг co
@МартенБодевес. Как вы упомянули, нет ответа.Я пишу ответ, чтобы задокументировать это, потому что ошибка теперь ясна при проверке кода.
Рейтинг:1
флаг co

Пока NTT изучает это, я публикую это как «решение»:

По проверке функции

void camellia_setup256 (const unsigned char *key, u32 *subkey)

понятно, что все обращения к выходному вектору 'подключу' выполняются с помощью макросов

#define CamelliaSubkeyL(INDEX) (подключ[(INDEX)*2])
#define CamelliaSubkeyR(INDEX) (подключ[(INDEX)*2 + 1])

Нигде в функции не найти ссылок на индексы 1 и 33. Эти индексы будут записывать слова в позиции 2, 3, 66 и 67. Это именно те 4 слова, которые не записываются в тестах.

Порт OpenSSL шифра Camellia (лицензия Apache 2.0) не имеет этой проблемы: сборка и с имеется в наличии.

Обновлять:

Я сравнил два приведенных выше порта с кодом из NTT, указанным в вопросе, следующим образом:

  1. сгенерировать случайный 256-битный ключ
  2. генерировать случайный 16-байтовый блок
  3. с каждой из трех реализаций зашифруйте блок, чтобы сравнить зашифрованный текст

Резюме: несмотря на неиспользованные слова в таблице ключей для реализации NTT, во всех миллионах проверенных пар ключ/блок все шифротексты, сгенерированные тремя реализациями, совпали.

Исправить:

Поскольку это не влияет на шифрование/дешифрование, исправление только уменьшает размер таблицы ключей с 68 до 64 слов.Так как код очень чистый и все обращения выполняются с помощью двух макросов выше, нужно изменить только 16 строк (проверено только с 256-битными ключами):

  1. Найдите все макросы, обращающиеся к индексу 24, и измените его на 1.
  2. Найдите все макросы, обращающиеся к индексу 32, и измените его на 24.

Я проверил это в процессе, описанном выше.

Maarten Bodewes avatar
флаг in
Прохладно. Вы проверили, можете ли вы исправить исходный код? Это было бы окончательным доказательством. Вы можете принять свой собственный ответ через 2 дня.
DannyNiu avatar
флаг vu
«Справочный код» внизу * [этой страницы] (https://info.isl.ntt.co.jp/crypt/eng/camellia/source/) содержит версию, которую я адаптировал для своего любителя. project (`long` -> `uint32_t`) для генерации тестовых векторов. Этот, кажется, работает правильно.
devnull avatar
флаг co
@DannyNiu Спасибо. Я описал исправление и некоторые тесты выше.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.