Puncte:1

Lungimile de ieșire AES nu sunt întotdeauna un multiplu de 16

drapel ng

Am o soluție C# care criptează o grămadă de bucăți mici de date folosind AES.

        //Așa configurez obiectul Aes
        var aes = Aes.Create();
        aes.Mode = CipherMode.CBC;
        aes.KeySize = 256;
        aes.Padding = PaddingMode.PKCS7;

Apoi scriu octeții de text cifrat brut în coloanele SQL Server VARBINARY.

Interogând lungimea acestor coloane de text cifrat VARBINARY, mă așteptam să fie întotdeauna un multiplu de 16 octeți. Cu toate acestea, nu pare să fie cazul aici.

Am încercat să citesc despre asta online și singurele întrebări pe care le-am găsit sunt de ce textul cifrat AES este completat cu blocuri de până la 16 octeți, așa că m-am gândit să întreb aici despre întrebarea inversă.

Note:

  • Am testat decriptarea unuia dintre aceste texte cifrate de dimensiuni ciudate și a funcționat bine, astfel încât textul cifrat nu este incorect.
  • Am observat că nu se întâmplă des, într-o singură cursă s-a întâmplat de 19 ori din 5.828.
  • Când se întâmplă, este întotdeauna unul cu unul (31 în loc de 32, 767 în loc de 768 etc..)

M-am gândit că poate standardul AES ar putea trunchia octeții de criptare care sunt exact zero (sau un alt număr binecunoscut) de la sfârșitul ieșirii, deoarece ar putea fi reconstruiți de către decriptor? Dar mi-ar plăcea clarificări.

Puncte:4
drapel my

Ai dreptate; AES-CBC standard (fără, să zicem, furtul de text cifrat) are o ieșire care este întotdeauna un multiplu de 16 octeți lungime.

O posibilitate care mi se pare că, dacă implementarea dvs. AES are o eroare, ar fi dacă ultimul octet s-ar întâmpla să fie 0x00, atunci nu l-ar scoate de fapt (și în direcția de decriptare, dacă textul cifrat ar fi scurt un octet, ar fi adăugați implicit un 0x00).

Dacă această ipoteză ar fi cazul, atunci în cele 5.828 de cazuri de testare, ne-am aștepta să vedem ca ultimul octet de text cifrat să fie 0 (și, prin urmare, trunchiat) de 22,8 ori; De 19 ori se încadrează într-o abatere standard și deci este plauzibil...

Maarten Bodewes avatar
drapel in
Rețineți că, în acest caz, puteți avea o reducere cu două o dată în 65536 (deci probabil că nu l-ați întâlnit încă), o reducere cu 3 o dată la ~4 miliarde etc. problemă (dacă are nevoie de remediere). De asemenea, am văzut o mulțime de probleme cu testarea dimensiunii binarului, cum ar fi preluarea binarului și apoi testarea dimensiunii folosind o funcție bazată pe șir (de exemplu, `strlen` în C). De fapt, aș crede că este mai probabil decât o eroare în rutinele de criptare / decriptare - deși implementările în majoritatea DB sunt și ele teribile.
drapel ng
Am scos una dintre valorile despre care SQL Server susține că este de 31 de octeți, dar valoarea returnată este de 32 de hexexpairs, așa că cred că @MaartenBodewes are dreptate și SQL Server doar raportează lungimea greșită când folosesc funcția LEN. Ceea ce mi se pare MAI interesant este că ultimul octet din toate acestea nu este 00, ci 20, care cred că este caracterul de spațiu ASCII? Poate că LEN îl tratează ca pe un șir și încearcă să decupeze automat șirurile? În orice caz, cred că aceasta nu mai este o întrebare cripto. EDIT: Tocmai am aflat despre funcția DATALENGTH, care este ceea ce ar fi trebuit să folosesc.
Puncte:0
drapel ng

Ok, după cum au indicat alții, standardul va produce întotdeauna un text cifrat cu o lungime care este un multiplu de 16 octeți. Problema a fost când măsuram lungimea pe care am folosit funcția T-SQL LEN care pare să reducă 0x20 de octeți de la sfârșitul secvențelor binare atunci când măsoară lungimea.

Am învățat acum că ar trebui să folosesc funcția DATALENGTH care nu face această tăiere, iar când am încercat-o, toate valorile sunt multipli de 16.

Scuze pentru confuzie!

Morrolan avatar
drapel ng
Pentru a clarifica - acesta este chiar comportamentul **așteptat** (deși ciudat) al T-SQL: „LEN exclude spațiile de sfârșit” ca de ex. [documentația oficială](https://docs.microsoft.com/en-us/sql/t-sql/functions/len-transact-sql?view=sql-server-ver15#remarks)
drapel ng
Da, atunci are mult mai mult sens. Mulțumesc @Morrolan

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.