Puncte:1

Camellia 1.2.0: cuvinte cu 0 la tabelul cheie

drapel co

Testarea unui cod care folosește Camellia 1.2.0 cod sursa, când se generează un keyTable din cheia de intrare, folosind:

void Camellia_Ekeygen(const int keyBitLength, 
          const unsigned char *rawKey, 
          KEY_TABLE_TYPE keyTable)

Ieșirea arată câteva cuvinte „la zero” în aceleași locuri. Două exemple aleatorii pentru 256 de biți:

E1AE67E4 07AE952B 94B0FCD1 CD366E1C 5160F1A8 45893AE8 0994EC20 1B5782AF

52027468 D2CEEB8F 00000000 00000000 5A44D15D 533F0EF8 E441183F 960616CE
B492E69C C71899DB 1C149A9E DA2EF3F9 C590DF1D 8ECE1AA3 5BF4C76A 517A719B
BA4E6211 083B6502 ABE0D506 6A3C58D4 32B152A6 C7D2AD48 2338FC75 4B1C4805
6FB9B4E4 4E14DA25 46CEF6AA D655F3C1 E89A9073 87CCF090 098D9E8F C73283B7
CD0F4BB9 E166D31C 7EE61ACE 52E97A40 0F5B9E82 4F98AEDE 91D08211 2E660D02
01506F57 40F9E4BA C2AB1164 196A9DE8 6E870140 C0A16094 F462E486 D98FF34F
F8543532 5ACAA32E 0046EFC7 06E9A0B9 42409189 9D9C0A16 EF580EC8 03E52B67
4D99620A B6A40197 3999A1B9 A9B45F27 6AE83BF0 7351AF36 6AEDF2EC 0A050076
B50EBD28 B9A2B34C 00000000 00000000


BE276A07 021C223F 40262C4B 2B07D216 AB51C522 C919C184 BBAD4565 B3050C87

93759D00 1DCE4C1F 00000000 00000000 91C6EBE1 47BE73E0 A1ECCAB9 B997E1E5
DEB11931 C13C15D2 EA9E2B5B 892BC368 BFD5F521 7B61B763 CB8C58B7 0AE271F1
617046B2 5951EB2E 2143C16C 4871D4EA 8AA8E801 3CD1E79E D64B23F5 DA983076
D6232073 5364BDE7 77FFE6AE B967FDE4 FDD26694 1720ECF0 6FC56EEE 3B618822
C46202F4 217DB0B2 A076E26B 23C22170 AD07C5E8 890AE608 EFC78526 F0F62449
7C712F1A D7CC710B C0FDB367 E97D2186 437CA739 F93D0CBF C90FF6E2 C879AA2B
511B3CF8 2E25C89E 7B745E74 CA705CCE 3DFD612D 1BE56472 FA45E7EA 4B3B85B0
95F84DCF 4C14FC95 20310BF7 A353A328 0E505958 A56CB1A1 007D2357 CC0239C8
4EFF9C31 2B9BEF19 00000000 00000000

Este de așteptat?

Clarificare: depozitele „hex” de mai sus arată două invocări ale funcției. Pentru fiecare keyBitLength este setată la 256, secvența mai scurtă (care se încadrează într-o linie) este o cheie aleatorie de 256 de biți și ceea ce urmează este rezultatul funcției (copiat în buffer-ul keyTable).

Un alt test: puneam la zero keyTable înainte de a apela funcția. Acum am setat toți octeții ca 0xFF și cuvintele zero au devenit: 0xFFFFFFFF. Infricosator. Aceste cuvinte (întotdeauna aceleași) nu sunt atinse de funcție.

Încercați să rezolvați folosind tipuri standard. De asemenea, am trecut la compilarea -O0 pentru a evita orice probleme de optimizare:

//typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
/* u32 trebuie să fie cuvânt pe 32 de biți */
//typedef unsigned int u32;
//typedef unsigned char u8;

#include <stdint.h> // aceasta este singura modificare a codului original (păstrat mai sus):
typedef uint32_t KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
typedef uint32_t u32;
typedef uint8_t u8;

Am încărcat un program minim de testare Aici.

DannyNiu avatar
drapel vu
Codul sursă presupus ca „lung” este pe 32 de biți, ceea ce poate să nu fie adevărat pentru sistemele pe 64 de biți. Încercați să înlocuiți definiția tipului pentru `Word` cu `uint32_t` la începutul codului sursă.
devnull avatar
drapel co
@DannyNiu. Mulțumiri. Am încercat asta și am actualizat întrebarea (nicio schimbare). De asemenea, am descărcat din nou sursa și am izolat un program de testare „minim” care este reproductibil pentru mine (687 de linii de cod). Ar trebui să-l încarc aici?
Maarten Bodewes avatar
drapel in
Poate că este puțin, dar, bineînțeles, îl puteți pune undeva unde sunt permise fragmente de cod și puteți pune un link în întrebare.Personal, aș încerca alt cod care este ușor de compilat (de exemplu, Bouncy Castle / Java) și apoi aș încerca să verific valorile pe care le-ați generat. Diferențele, cum ar fi toate valorile zero etc., ar trebui să fie ușor de observat.
Maarten Bodewes avatar
drapel in
Uf, pentru oricine merge pe acea cale, BC specifică RFC 3713. Nu primesc deloc aceleași valori, cred că una este v1 și cealaltă v2 din cifrul Camelia. Oftat, asta se potrivește pentru o altă întrebare presupun.
devnull avatar
drapel co
@MaartenBodewes Tocmai am descărcat versiunea x86_64 asm de pe aceeași pagină (primul link în partea de sus) și generează un keyTable complet diferit (și fără cele 4 cuvinte neutilizate). Am trimis un e-mail la adresa de contact de pe aceeași pagină și voi raporta aici orice răspuns relevant.
Maarten Bodewes avatar
drapel in
Sper că veți primi un răspuns, uneori este dificil să obțineți răspunsuri din Japonia :)
devnull avatar
drapel co
@MaartenBodewes. După cum ați menționat, niciun răspuns.Scriu un răspuns pentru a documenta acest lucru, deoarece bug-ul este clar acum prin inspectarea codului.
Puncte:1
drapel co

În timp ce NTT analizează acest lucru, postez asta ca o „soluție”:

Prin inspecția funcției

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

este clar că toate accesele la vectorul de ieșire „subcheie” sunt efectuate folosind macrocomenzi

#define CamelliaSubkeyL(INDEX) (subcheie[(INDEX)*2])
#define CamelliaSubkeyR(INDEX) (subcheie[(INDEX)*2 + 1])

Nicăieri în funcție nu se găsesc referințe la indicii 1 și 33. Acești indici ar scrie în pozițiile cuvintelor 2, 3, 66 și 67. Acestea sunt exact 4 cuvinte în care nu sunt scrise în teste.

Portul OpenSSL al cifrului Camellia (Licența Apache 2.0) nu are această problemă: asamblare și c disponibil.

Actualizați:

Am comparat cele două porturi de mai sus cu codul de la NTT legat în întrebare, după cum urmează:

  1. generați o cheie aleatorie de 256 de biți
  2. generează un bloc aleatoriu de 16 octeți
  3. cu fiecare dintre cele 3 implementări criptați blocul pentru a compara textul cifrat

Rezumat: în ciuda cuvintelor neutilizate din keyTable pentru implementarea NTT, în toate milioanele de perechi cheie/bloc testate, toate textele cifrate generate de cele 3 implementări s-au potrivit.

Remediere:

Deoarece nu afectează criptarea/decriptarea, remedierea reduce doar dimensiunea keyTable de la 68 la 64 de cuvinte.Deoarece codul este foarte curat și toate accesările sunt efectuate cu cele două macrocomenzi de mai sus, trebuie schimbate doar 16 linii (testat doar cu chei de 256 de biți):

  1. Găsiți toate macrocomenzile care accesează indexul 24 și schimbați-l la 1
  2. Găsiți toate macrocomenzile care accesează indexul 32 și schimbați-l la 24

Am testat acest lucru în procesul descris mai sus.

Maarten Bodewes avatar
drapel in
Rece. Ați verificat dacă puteți repara codul original? Asta ar fi dovada supremă. Puteți accepta propriul răspuns după 2 zile.
DannyNiu avatar
drapel vu
„Codul de referință” din *partea de jos* a [această pagină](https://info.isl.ntt.co.jp/crypt/eng/camellia/source/) conține versiunea pe care am adaptat-o ​​pentru pasionatul meu proiect (`long` -> `uint32_t`) pentru generarea vectorilor de testare. Acesta pare să funcționeze corect.
devnull avatar
drapel co
@DannyNiu Mulțumesc. Am descris mai sus remedierea și câteva teste.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.