Algoritmul GOST 28147 89 este. Standard de criptare a datelor interne

În țara noastră, un algoritm unificat pentru reprezentarea criptografică a datelor pentru sistemele de prelucrare a informațiilor în rețele de calculatoare, sisteme de calcul individuale și calculatoare, care este determinat de GOST 28147-89.

Acest algoritm de conversie a datelor criptografice este un algoritm de bloc de 64 de biți cu o cheie de 256 de biți, conceput pentru implementarea hardware și software, îndeplinește cerințele criptografice și nu impune restricții cu privire la gradul de secretizare a informațiilor protejate.

Când descrieți algoritmul, se utilizează următoarea notație:

L şi R sunt secvenţe de biţi;
LR este concatenarea secvenţelor L şi R, în care biţii secvenţei R urmează biţii secvenţei L;
(+) - adiție pe biți modulo 2 (operație „SAU exclusivă”);
[+] - adăugarea numerelor pe 32 de biți modulo 2 32 ;
(+) - adăugarea numerelor pe 32 de biți modulo 2 32 -1.

Numerele se însumează după următoarea regulă:

A[+]B=A+B dacă A+B< 2 32 ,
A [+] B = A + B - 2 32 dacă A + B >= 2 32 . A (+) B = A + B dacă A + B< 2^32 - 1, A {+} B = A + B - (2^32 - 1), если A + B >= 2^32 - 1.

Algoritmul oferă patru moduri de funcționare:

În orice caz, o cheie de 256 de biți K este utilizată pentru a cripta datele, care este reprezentată ca opt subchei de 32 de biți K i:

K = K 7 K 6 K 5 K 4 K 3 K 2 K 1 K 0 .

Decriptarea se realizează cu aceeași cheie ca și criptarea, dar acest proces este inversul procesului de criptare a datelor.

Mod de schimb ușor

Primul și cel mai simplu mod - înlocuire. Datele de criptat sunt împărțite în blocuri de 64 de biți. Procedura de criptare pentru blocul de date deschis T 0 include 32 de cicluri (j=1...32).

Blocul T 0 este împărțit în două secvențe de 32 de biți: B(0)A(0), unde B(0) sunt biții din stânga sau cei mai semnificativi, A(0) sunt biții din dreapta sau cel mai puțin semnificativ.

Aceste secvențe sunt introduse în unitățile N 1 și N 2 înainte de începerea primului ciclu de criptare.

Primul ciclu (j=1) al procedurii de criptare pentru un bloc de date pe 64 de biți este descris prin următoarele formule:

Aici i desemnează numărul de iterație (i = 1, 2,..., 32).

Funcția f se numește funcție de criptare. Argumentul său este suma modulo 2 32 a numărului A(i) obținut la pasul de iterație anterior și numărul X(j) al cheii (dimensiunea fiecăruia dintre aceste numere este de 32 de cifre).

Funcția de criptare include două operații asupra sumei de 32 de biți rezultată. Prima operație se numește substituție K. Blocul de substituție K este format din 8 noduri de substituție K(1) ... K(8) cu o memorie de 64 de biți fiecare. Vectorul de 32 de biți care ajunge la blocul de substituție este împărțit în 8 vectori consecutivi de 4 biți, fiecare dintre care este convertit într-un vector de 4 biți de către nodul de înlocuire corespunzător, care este un tabel de 16 numere întregi în intervalul 0.. .15.

Vectorul de intrare specifică adresa rândului din tabel al cărui număr este vectorul de ieșire. Vectorii de ieșire de 4 biți sunt apoi combinați secvențial într-un vector de 32 de biți. Tabelul bloc de substituție K conține elemente cheie comune rețelei de calculatoare și rar schimbate.

A doua operație este o deplasare ciclică la stânga a vectorului de 32 de biți obținut prin substituirea K. Blocul de date criptat de 64 de biți Tw este reprezentat ca Tw =A(32)B(32).

Restul blocurilor de date deschise în modul de înlocuire simplă sunt criptate în același mod.

Rețineți că modul de înlocuire simplu poate fi utilizat pentru criptarea datelor numai în cazuri limitate. Aceste cazuri includ generarea unei chei și criptarea acesteia cu asigurarea protecției la imitație (protecție împotriva impunerii de date false) pentru transmiterea prin canale de comunicație sau stocarea în memoria computerului.

Modul Gamma

Datele deschise, împărțite în blocuri de 64 de biți T(i) (i=1, 2,..., m, unde m este determinat de cantitatea de date criptate), sunt criptate în modul gamma prin adăugare pe biți modulo 2 cu cifra gamma Гw, care este produsă în blocuri de 64 de biți, adică Гw = (Г(1),Г(2),...,Г(i),...,Г(m)).

Ecuația de criptare a datelor în modul gamma poate fi reprezentată după cum urmează:

W(i) = A (Y(i-1) [+] C2, Z(i-1) (+) C1) (+) T(i) = G(i) (+) T(i).
Aici W(i) este un bloc de text cifrat pe 64 de biți,
A - funcție de criptare în modul de înlocuire simplă (argumentele acestei funcție sunt două numere de 32 de biți),
C1 și C2 - constante specificate în GOST 28147-89,
Y(i) și Z(i) sunt cantități care sunt determinate iterativ, deoarece gama se formează după cum urmează:
(Y(0), Z(0)) = A(S), unde S este o secvență binară de 64 de biți (mesaj de sincronizare);
(Y(i), Z(i)) = (Y(i-1) [+] C2, Z(i-1) (+) C1) pentru i = 1, 2,...,m.

Decriptarea datelor este posibilă numai dacă există un mesaj de sincronizare, care nu este un element secret al cifrului și poate fi stocat în memoria computerului sau transmis prin canale de comunicație împreună cu datele criptate.

Modul de feedback gamma

Modul scalare Cu părere foarte asemănător cu modul gamma. Ca și în modul gamma, datele deschise împărțite în blocuri de 64 de biți T(i) (i=1, 2,..., m , unde m este determinat de cantitatea de date criptate), sunt criptate prin adăugare pe biți modulo 2 cu cifrul gamma G sh, care este produs în blocuri de 64 de biți:

Гw = (Г(1),Г(2),...,Г(i),...,Г(m)).

Numărul de biți din blocul T(m) poate fi mai mic de 64, în timp ce partea de cifră gamma din blocul G(m) care nu este utilizată pentru criptare este eliminată.

Ecuația de criptare a datelor în modul gamma cu feedback poate fi reprezentată după cum urmează:


Aici W(i) este un bloc de text cifrat pe 64 de biți,
A - funcție de criptare în modul de înlocuire simplă. Argumentul funcției de la primul pas al algoritmului iterativ este un mesaj de sincronizare pe 64 de biți, iar la toți pașii următori - blocul anterior de date criptate W(i-1).

Inserții de imitație

Proces de dezvoltare stive de imitație este uniform pentru oricare dintre modurile de criptare a datelor.

Inserția de imitație este un bloc de p biți (inserția de imitație Ip), care este produs fie înainte de criptarea întregului mesaj, fie în paralel cu criptarea bloc cu bloc. Primele blocuri de date deschise care sunt implicate în dezvoltarea simulării de inserare pot conține informații de serviciu (de exemplu, partea de adresă, ora, mesajul de sincronizare) și să nu fie criptate. Valoarea parametrului p (numărul de cifre binare din insertul simulat) este determinată de cerințele criptografice, ținând cont de faptul că probabilitatea de a impune interferențe false este de 1/2^p.

Pentru a obține o imitație de inserare, datele deschise sunt reprezentate ca blocuri de 64 de biți T(i) (i = 1, 2,..., m , unde m este determinat de cantitatea de date criptate). Primul bloc de date deschise T(1) este supus unei transformări corespunzătoare primelor 16 cicluri ale algoritmului de criptare în modul de înlocuire simplă. Mai mult, cheia folosită pentru criptarea datelor este folosită ca cheie pentru generarea inserției de imitație.

Numărul de 64 de biți obținut după 16 cicluri de lucru este însumat modulo 2 cu al doilea bloc de date deschis T(2). Rezultatul însumării este supus din nou transformării corespunzătoare primelor 16 cicluri ale algoritmului de criptare în modul de înlocuire simplă. Numărul rezultat pe 64 de biți este adăugat modulo 2 celui de-al treilea bloc de date deschis T(3) și așa mai departe. Ultimul bloc T(m), dacă este necesar, completat la un bloc complet de 64 de biți cu zerouri, este însumat modulo 2 cu rezultatul muncii la pasul m-1, după care este criptat în modul de înlocuire simplă peste primul 16 cicluri ale algoritmului. Din numărul primit pe 64 de biți, este selectat un segment Ip cu lungimea p biți.

Inserția de imitație Ip este transmisă printr-un canal de comunicație sau în memoria computerului după datele criptate. Datele criptate primite sunt decriptate, iar din blocurile primite de date deschise T(i) se generează o imitație de inserție Ip, care este apoi comparată cu imitația de inserție IR primită de la canalul de comunicație sau din memoria computerului. nu se potrivesc, toate datele decriptate sunt considerate false.

Scurtă descriere a cifrului

GOST 28147-89 - Standardul sovietic și rus pentru criptarea simetrică, introdus în 1990, este, de asemenea, un standard CIS. Nume complet - „GOST 28147-89 Sisteme de procesare a informațiilor. Protecție criptografică. Algoritmul de transformare criptografică”. Algoritm de cifrare bloc. Când se utilizează metoda de criptare cu gamma, poate îndeplini funcțiile unui algoritm de criptare de flux.

GOST 28147-89 este un cifr de bloc cu o cheie de 256 de biți și 32 de cicluri de conversie, care funcționează cu blocuri de 64 de biți. Baza algoritmului de cifrare este Rețeaua Feistel. Modul de criptare de bază în conformitate cu GOST 28147-89 este modul de înlocuire simplu (de asemenea, sunt definite moduri mai complexe - gamma, gamma cu feedback și inserare imitată).

Cum funcționează algoritmul

Algoritmul nu este fundamental diferit de DES. Conține și cicluri de criptare (sunt 32) conform schemei Feistel (Fig. 2.9.).

Orez. 2.9. Runde de criptare ale algoritmului GOST 28147-89.

Pentru a genera subchei, cheia originală de 256 de biți este împărțită în opt blocuri de 32 de biți: k 1 …k 8 . Cheile k 9 ... k 24 sunt o repetare ciclică a tastelor k 1 ... k 8 (numerotate de la cei mai puțin semnificativi biți la cei mai semnificativi). Cheile k 25 ...k 32 sunt cheile k 1 ...k 8 mergând în ordine inversă.

După ce toate cele 32 de runde ale algoritmului sunt finalizate, blocurile A 33 și B 33 sunt lipite împreună (rețineți că A 33 devine bitul cel mai semnificativ, iar B 33 devine bitul cel mai puțin semnificativ) - rezultatul este rezultatul algoritmului.

Funcţie f(A i ,K i) se calculează după cum urmează: A i și Ki sunt adăugate modulo 2 32 , apoi rezultatul este împărțit în opt subsecvențe de 4 biți, fiecare dintre acestea fiind alimentată la intrarea proprie. nodul tabel de substituție(în ordinea crescătoare a priorității biților), numită mai jos S-bloc. Numărul total de blocuri GOST S este de opt, adică același cu numărul de subsecvențe. Fiecare S-bloc reprezintă o permutare a numerelor de la 0 la 15. Prima subsecvență de 4 biți cade pe intrarea primei S-box, a doua - pe intrarea celei de-a doua, etc. Ieșirile tuturor celor opt S-box sunt combinate în un cuvânt de 32 de biți, apoi întregul cuvânt este deplasat ciclic la stânga (la cei mai semnificativi biți) cu 11 biți. Toate cele opt cutii S pot fi diferite. De fapt, ele pot fi un material cheie suplimentar, dar cel mai adesea sunt un parametru de schemă care este comun unui anumit grup de utilizatori. Textul standardului indică faptul că livrarea de umplere a unităților de înlocuire (blocuri S) se efectuează în modul prescris, de exemplu. dezvoltator de algoritmi. Comunitatea dezvoltatorilor rusi CIPF a fost de acord asupra nodurilor de înlocuire utilizate pe Internet.

Decriptarea se realizează în același mod ca și criptarea, dar ordinea subcheilor k i este inversată.

Moduri de funcționare ale algoritmului GOST 28147-89

Algoritmul GOST 28147-89 are patru moduri de funcționare.

1. Modulînlocuire simplă acceptă date ca intrare, a căror dimensiune este un multiplu de 64 de biți. Rezultatul criptării este textul de intrare, convertit în blocuri de 64 de biți în cazul criptării cu ciclul „32-3”, iar în cazul decriptării - cu ciclul „32-P”.

2. Modulscalare acceptă date de orice dimensiune ca intrare, precum și un parametru suplimentar de 64 de biți - mesaj de sincronizare. În timpul funcționării, mesajul de sincronizare este convertit în ciclul „32-Z”, rezultatul este împărțit în două părți. Prima parte se adaugă modulo 2 32 cu o valoare constantă de 1010101 16 . Dacă a doua parte este egală cu 2 32 -1, atunci valoarea sa nu se modifică, altfel se adaugă modulo 2 32 -1 cu o valoare constantă de 1010104 16 . Valoarea obținută prin combinarea ambelor părți convertite, numită gamma cifră, intră în bucla „32-3”, rezultatul acesteia este adăugat pe bit modulo 2 cu un bloc de date de intrare de 64 de biți. Dacă acesta din urmă este mai mic de 64 de biți, atunci biții suplimentari ai valorii primite sunt eliminați. Valoarea rezultată este trimisă la ieșire. Dacă încă sunt date primite, atunci acțiunea se repetă: blocul compus din părți de 32 de biți este convertit în părți și așa mai departe.

3. Modulscalare cu feedback acceptă, de asemenea, date de orice dimensiune și un mesaj de sincronizare ca intrare. Blocul de date de intrare este adăugat pe biți modulo 2 cu rezultatul transformării în ciclul „32-3” a mesajului de sincronizare. Valoarea rezultată este trimisă la ieșire. Valoarea mesajului de sincronizare este înlocuită în cazul criptării cu blocul de ieșire, iar în cazul decriptării - cu intrarea, adică criptată. Dacă ultimul bloc de date primite este mai mic de 64 de biți, atunci biții suplimentari ai gamma (ieșirea buclei „32-3”) sunt eliminați. Dacă încă există date primite, atunci acțiunea se repetă: cifrul gamma este format din rezultatul criptării valorii înlocuite și așa mai departe.

4. Modul de producțieinserții de imitație preia date de intrare care au o dimensiune de cel puțin două blocuri complete de 64 de biți și returnează un bloc de date de 64 de biți, numit uzurpare a inserției. Valoarea temporară de 64 de biți este setată la 0, apoi, în timp ce există date de intrare, este adăugată pe biți modulo 2 cu rezultatul executării ciclului "16-3", a cărui intrare este blocul de date de intrare . După încheierea introducerii, valoarea temporară este returnată ca rezultat.

Criptanaliză a cifrului

Cifrul GOST 28147-89 utilizează o cheie de 256 de biți, iar dimensiunea spațiului de cheie este 2256 . Niciun computer de uz general care există în prezent nu poate ghici o cheie în mai puțin de multe sute de ani. Standardul rus GOST 28147-89 a fost proiectat cu o marjă mare și depășește standardul DES american cu multe ordine de mărime, cu dimensiunea sa reală a cheii de 56 de biți și volumul spațiului cheie de numai 2 56 .

Există, de asemenea, atacuri asupra rundei complete GOST 28147-89 fără modificări. Unul dintre primii lucrări deschise, în care a fost efectuată analiza algoritmului, folosește punctele slabe ale procedurii de extindere a cheilor a unui număr de algoritmi de criptare bine-cunoscuți. În special, algoritmul complet GOST 28147-89 poate fi rupt folosind criptoanaliza diferențială pe chei legate, dar numai dacă sunt utilizate tabele de substituție slabe. Versiunea de 24 de runde a algoritmului (căreia îi lipsesc primele 8 runde) este deschisă în același mod pentru orice mese de înlocuire, cu toate acestea, tabelele de înlocuire puternice fac un astfel de atac complet nepractic.

Oamenii de știință autohtoni A.G. Rostovtsev și E.B. Makhovenko a propus în 2001 o metodă fundamental nouă de criptoanaliza prin formarea unei funcții obiective dintr-un text simplu cunoscut, textul cifrat corespunzând acestuia și valoarea dorită a cheii și găsirea extremului său corespunzător valorii adevărate a cheii. Ei au găsit, de asemenea, o clasă mare de chei slabe ale algoritmului GOST 28147-89, care vă permit să deschideți algoritmul folosind doar 4 texte clare selectate și textele cifrate corespunzătoare cu o complexitate destul de scăzută.

În 2004, un grup de experți din Coreea a propus un atac prin care, folosind criptoanaliza diferențială a cheilor asociate, este posibil să se obțină o cheie secretă de 12 biți cu o probabilitate de 91,7%. Atacul necesită 235 de texte clare alese și 236 de operațiuni de criptare. După cum puteți vedea, acest atac este practic inutil pentru deschiderea reală a algoritmului.

Tabelul de substituție este un element cheie pe termen lung, adică este valabil pentru mult mai mult termen lung decât o singură cheie. Se presupune că este comun tuturor nodurilor de criptare din cadrul unui sistem de protecție criptografică. Calitatea acestui tabel determină calitatea cifrului. Cu un tabel de substituție „puternic”, puterea cifrului nu scade sub o anumită limită acceptabilă, chiar dacă este dezvăluită. În schimb, utilizarea unui tabel „slab” poate reduce puterea cifrului la o limită inacceptabil de scăzută. Nu există informații despre calitatea tabelului de substituții în sigiliu deschis Rusia nu a fost publicată, dar existența tabelelor „slabe” este fără îndoială – un exemplu este tabelul de substituție „trivial”, conform căruia fiecare valoare este înlocuită de la sine. Într-o serie de lucrări, se ajunge la concluzia eronată că tabelele secrete de substituție ale algoritmului GOST 28147-89 pot face parte din cheie și pot crește lungimea efectivă a acesteia (ceea ce nu este semnificativ, deoarece algoritmul are o cheie foarte mare de 256 de biți). ).

Acest algoritm este obligatoriu pentru utilizare ca algoritm de criptare în organizatii guvernamentale RF și o serie de altele comerciale.

Descrierea algoritmului

Schema algoritmului este prezentată în fig. 3.1. După cum puteți vedea, schema acestui algoritm este destul de simplă, ceea ce simplifică fără ambiguitate implementarea software sau hardware.

Algoritmul GOST 28147-89 criptează informațiile în blocuri de 64 de biți, care sunt împărțite în două subblocuri de 32 de biți (N1 și N2). Subblocul N1 este procesat într-un anumit mod, după care se adaugă valoarea acestuia

cu valoarea subblocului N2 (adăugarea se realizează modulo 2), apoi subblocurile sunt schimbate. O astfel de transformare se realizează pentru un anumit număr de runde: 16 sau 32, în funcție de modul de funcționare al algoritmului (descris mai jos). În fiecare rundă se efectuează următoarele operații:

1. Suprapunerea tastelor. Conținutul subblocului /VI este adăugat modulo 2 32 la partea Kx a cheii.

Cheia de criptare a algoritmului GOST 28147-89 are o dimensiune de 256 de biți, iar Kx este partea sa de 32 de biți, adică o cheie de criptare de 256 de biți este reprezentată ca o concatenare a subcheilor de 32 de biți (Fig. 3.2):

SH ATI, AG2, Yu, AG4, K5, Kb, K7.

În timpul procesului de criptare, se utilizează una dintre aceste subchei, în funcție de numărul rotund și de modul de funcționare al algoritmului.

Orez. 3.1. Schema algoritmului GOST 28147-

Orez. 3.2. Cheia de criptare a algoritmului GOST 28147-89

2. Înlocuire tabulară. După suprapunerea cheii, subblocul /VI este împărțit în 8 părți de 4 biți, valoarea fiecăruia fiind înlocuită individual în conformitate cu tabelul de înlocuire pentru această parte a subblocului. Înlocuirile de masă (cutie de înlocuire, cutie S) sunt adesea folosite în algoritmi moderni criptare, așa că merită să le luați în considerare mai detaliat.

Înlocuirea tabelului este utilizată în acest fel: un bloc de date de o anumită dimensiune (în acest caz, 4 biți) este alimentat la intrare, a cărui reprezentare numerică determină numărul valorii de ieșire. De exemplu, avem o S-box de următoarea formă:

4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1.

Lăsați blocul de 4 biți „0100” să vină la intrare, adică valoarea este 4. Conform tabelului, valoarea de ieșire va fi 15, adică. „1111” (0 este înlocuit cu 4, 1 este înlocuit cu 11, valoarea lui 2 nu este schimbată etc.).

După cum puteți vedea, schema algoritmului este foarte simplă, ceea ce înseamnă că cea mai mare povară a criptării datelor cade pe tabelele de înlocuire. Din păcate, algoritmul are proprietatea că există tabele de substituție „slabe”, folosindu-se de care algoritmul poate fi dezvăluit prin metode criptoanalitice. Cele slabe includ, de exemplu, un tabel în care rezultatul este egal cu intrarea:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.

3. Deplasare ciclică la stânga pe biți cu 11 biți.

Moduri de algoritm

Algoritmul GOST 28147-89 are 4 moduri de funcționare:

□ mod simplu de înlocuire;

□ modul gamma;

P mod de joc cu feedback;

□ mod de producție a atașamentelor de imitație.

Aceste moduri sunt oarecum diferite de cele general acceptate (descrise în Secțiunea 1.4), așa că merită să le analizăm mai detaliat.

Aceste moduri au scopuri diferite, dar folosesc aceeași transformare de criptare descrisă mai sus.

Mod de schimb ușor

În modul de înlocuire simplă, cele 32 de runde descrise mai sus sunt efectuate pur și simplu pentru a cripta fiecare bloc de informații pe 64 de biți. Subcheile pe 32 de biți sunt utilizate în următoarea secvență:

□ KO, Kl, K2, K3, K4, K5, Kb, AG7, KO, ATI etc. - în rundele 1 la 24;

□ K1, Kb, K5, K4, K3, K2, K\, KO - în rundele 25 până la 32.

Decriptarea în modul de înlocuire simplă se face exact în același mod, dar cu o secvență ușor diferită de utilizare a subcheilor:

□ KO, K\, K2, KZ, K4, K5, Kb, KP - în rundele 1 la 8;

□ KP, Kb, K5, K4, K3, K2, K\, KO, K1, Kb etc. - în rundele 9 până la 32.

Similar cu modul standard ECB, datorită criptării separate a blocurilor, modul de înlocuire simplă nu este recomandat pentru criptarea datelor reale; ar trebui folosit doar pentru a cripta alte chei de criptare în scheme cu mai multe chei.

Modul Gamma

În modul gamma (Fig. 3.3), fiecare bloc al textului simplu este adăugat bit cu bit modulo 2 la blocul gamma al cifrului cu o dimensiune de 64 de biți. Cifrul gamma este o secvență specială care este generată folosind transformările descrise mai sus, după cum urmează:

1. În registrele N1 și N2 se scrie umplerea lor inițială - o valoare de 64 de biți, numită „mesaj de sincronizare” (un mesaj de sincronizare, de fapt, este un analog al vectorului de inițializare în modurile CBC, CFB și OFB ).

2. Conținutul registrelor /VI și N2 (în acest caz, mesajele de sincronizare) este criptat în modul de înlocuire simplă.

3. Conținutul lui N1 se adaugă modulo (2 32 - 1) cu constanta CI = 2 24 + 2 16 + 2 8 + 4 , rezultatul adunării se scrie în registrul /VI.

4. Conținutul lui N2 se adaugă modulo 2 cu constanta C2 = 2 24 + 2 16 + 2 8 +1, rezultatul adunării se scrie în registrul N2.

5. Conținutul registrelor /VI și N2 este scos ca un bloc gamma de 64 de biți (adică, în acest caz, /VI și N2 formează primul bloc gamma).

6. Dacă este necesar următorul bloc gamma (adică criptarea sau decriptarea trebuie să continue), reveniți la pasul 2.

Pentru decriptare, un gamma este generat în același mod, apoi operația XOR este din nou aplicată textului cifrat și biților gamma.

Pentru a genera aceeași cifră gamma, utilizatorul care decriptează criptograma trebuie să aibă aceeași cheie și aceeași valoare a mesajului de sincronizare care au fost folosite pentru a cripta informațiile. În caz contrar, nu veți putea obține textul original din cel criptat.

În majoritatea implementărilor algoritmului GOST 28147-89, mesajul de sincronizare nu este un element secret, dar mesajul de sincronizare poate fi la fel de secret ca și cheia de criptare. În acest caz, putem considera că lungimea efectivă a cheii algoritmului (256 de biți) este mărită cu încă 64 de biți ai mesajului de sincronizare, ceea ce poate fi considerat ca un element cheie suplimentar.

Modul de feedback gamma

În modul feedback gamma, pornind de la al 2-lea bloc, registrele /VI și L/2 sunt umplute nu cu blocul gamma anterior, ci cu rezultatul criptării blocului text simplu anterior (Fig. 3.4). Primul bloc din acest mod este generat exact în același mod ca și cel anterior.

Orez. 3.4. Generarea cifrului gamma în modul gamma cu feedback

Modul de generare a imitatorului

O falsificare este o sumă de control criptografică calculată folosind o cheie de criptare și concepută pentru a verifica integritatea mesajelor. Pentru a-l calcula, există un mod special al algoritmului GOST 28147-89.

Generarea prefixului de imitație se realizează după cum urmează:

1. Primul bloc de informații de 64 de biți, pentru care se calculează imitatorul, este scris în registrele N1 și N2 și criptat în modul de înlocuire simplă redusă, în care sunt efectuate primele 16 runde din 32.

2. Rezultatul obținut se însumează modulo 2 cu următorul bloc de informații, salvând rezultatul în N1 și N2.

3. M și N2 sunt din nou criptate în modul redus de înlocuire simplă și așa mai departe până la ultimul bloc de informații.

Un prefix este considerat conținutul rezultat pe 64 de biți al registrelor N1 și N2 sau o parte a acestuia. Cel mai adesea, se folosește un prefix de imitație de 32 de biți, adică jumătate din conținutul registrelor. Acest lucru este suficient, deoarece, ca orice sumă de control, prefixul de imitație este destinat în primul rând să protejeze împotriva distorsiunii accidentale a informațiilor. Pentru a proteja împotriva modificării deliberate a datelor, sunt utilizate alte metode criptografice - în primul rând electronice semnatura digitala(vezi secțiunea 1.1).

Prefixul de imitație este utilizat după cum urmează:

1. La criptarea oricărei informații, imitatorul de text simplu este calculat și trimis împreună cu textul cifrat.

2. După decodare, prefixul de imitație este din nou calculat și comparat cu cel trimis.

3. Dacă prefixele de imitație calculate și trimise nu se potrivesc, textul cifrat a fost distorsionat în timpul transmiterii sau au fost folosite chei incorecte în timpul decriptării.

Prefixul de imitație este util în special pentru a verifica decriptarea corectă a informațiilor cheie atunci când se utilizează scheme cu mai multe chei.

Prefixul de imitație este un analog al codului de autentificare a mesajului MAC calculat în modul CBC; diferența este că calculul prefixului nu folosește un mesaj de sincronizare, în timp ce calculul MAC folosește un vector de inițializare.

Puterea criptografică a algoritmului

În 1994, descrierea algoritmului GOST 28147-89 a fost tradusă în engleză și publicată; după aceasta au început să apară rezultatele analizelor sale efectuate de experți străini; cu toate acestea, nu au fost găsite atacuri care se apropie de practic pentru o perioadă semnificativă de timp.

□ lungime cheie mare - 256 biți; împreună cu mesajul de sincronizare secretă, lungimea efectivă a cheii crește la 320 de biți;

□ 32 de runde de transformări; deja după 8 runde, efectul complet de dispersie a datelor de intrare este atins: schimbarea unui bit din blocul de text simplu va afecta toți biții din blocul de text cifrat și invers, adică există o marjă de siguranță multiplă.

Luați în considerare rezultatele criptoanalizei algoritmului GOST 28147-89.

Analiza tabelelor de substituție

Deoarece tabelele de substituție nu sunt date în standard, o serie de lucrări (de exemplu, în) sugerează că o „organizație competentă” poate emite atât tabele de substituție „bune” cât și „rele”. Cu toate acestea, celebrul expert Bruce Schneier numește astfel de presupuneri „zvonuri”. Este clar că puterea criptografică a algoritmului depinde în mare măsură de proprietățile tabelelor de substituție utilizate, respectiv, există tabele de substituție slabe (vezi mai sus pentru un exemplu), a căror utilizare poate simplifica atacul algoritmului. Cu toate acestea, posibilitatea utilizării diferitelor tabele de substituție pare a fi o idee foarte demnă, susținută de următoarele două fapte din istoria standardului de criptare DES (a se vedea Secțiunea 3.15 pentru detalii):

□ atacurile care utilizează atât criptoanaliza liniară, cât și diferențială a algoritmului DES utilizează caracteristici specifice tabelelor de substituție; atunci când utilizați alte tabele, criptoanaliza va trebui să o ia de la capăt;

□ Au fost făcute încercări de consolidare a DES împotriva criptoanalizei liniare și diferențiale prin utilizarea tabelelor de substituție mai puternice; astfel de tabele, care sunt într-adevăr mai stabile, au fost propuse, de exemplu, în algoritmul s 5 DES; dar, din păcate, a fost imposibil să înlocuim DES cu s 5 DES, deoarece tabelele de înlocuire sunt definite rigid în standard, respectiv, implementările algoritmului probabil nu suportă capacitatea de a schimba tabelele cu altele.

Într-o serie de lucrări (de exemplu, , și ) se concluzionează în mod eronat că tabelele de substituție secrete ale algoritmului GOST 28147-89 pot face parte din cheie și pot crește lungimea efectivă a acesteia (ceea ce nu este semnificativ, deoarece algoritmul are o cheie foarte mare de 256 de biți). Cu toate acestea, lucrarea demonstrează că tabelele de substituție secretă pot fi calculate folosind următorul atac, care poate fi aplicat practic:

1. Setați cheia nulă și căutați „vectorul nul”, adică valoarea z = /(0), unde /() este funcția rotundă a algoritmului. Această etapă necesită aproximativ 2 operațiuni de criptare.

2. Folosind vectorul zero, se calculează valorile tabelelor de substituție, care nu necesită mai mult de 2 11 operații.

Modificări de algoritm și analiza acestora

În cadrul lucrării, a fost efectuată o criptoanaliza a modificărilor algoritmului GOST 28147-89:

□ algoritmul GOST-H, în care, în raport cu algoritmul inițial, se modifică ordinea de utilizare a subcheilor, și anume, în runde de la a 25-a la a 32-a subchei sunt folosite în ordine directă, adică în același mod ca în precedenta runde ale algoritmului;

□ Un algoritm GOST® cu 20 de runde care utilizează XOR în loc de modulo 2 32 pentru suprapunerea cheilor.

Pe baza rezultatelor analizei, s-a ajuns la concluzia că GOST-H și GOST© sunt mai slabe decât algoritmul GOST 28147-89 original, deoarece ambele au clase de chei slabe. Este de remarcat faptul că în ceea ce privește criptoanaliza GOST©, lucrarea repetă cuvânt cu cuvânt secțiunea despre criptoanaliza algoritmului GOST 28147-89, publicată în 2000 într-o lucrare binecunoscută (fără nicio referire la original). Aceasta pune sub semnul întrebării profesionalismul autorilor lucrării și celelalte rezultate ale acesteia.

În lucrare se propune o modificare foarte interesantă a algoritmului: tabelele S \ ... Ss trebuie neapărat să fie diferite; în fiecare rundă a algoritmului, acestea trebuie permutate conform unei anumite legi. Această permutare poate depinde de cheia de criptare sau poate fi secretă (adică să facă parte dintr-o cheie de criptare mai mare decât cheia originală de 256 de biți). Ambele opțiuni, potrivit autorilor lor, cresc semnificativ rezistența algoritmului împotriva criptoanalizei liniare și diferențiale.

Și încă o modificare legată de tabelele de substituție este dată în lucrare, în care este analizată una dintre metodele posibile de calculare a tabelelor de substituție pe baza cheii de criptare. Autorii lucrării au concluzionat că o astfel de dependență slăbește algoritmul, deoarece duce la prezența cheilor slabe și la unele potențiale vulnerabilități ale algoritmului.

Analiza algoritmului complet

Există, de asemenea, atacuri asupra rundei complete GOST 28147-89 fără modificări. Una dintre primele lucrări deschise în care s-a efectuat analiza algoritmului, o lucrare binecunoscută, este dedicată atacurilor care exploatează punctele slabe ale procedurii de extindere a cheilor a unui număr de algoritmi de criptare cunoscuți. În special, algoritmul complet GOST 28147-89 poate fi rupt folosind criptoanaliza diferențială pe chei legate, dar numai dacă sunt utilizate tabele de substituție slabe. Versiunea de 24 de runde a algoritmului (căreia îi lipsesc primele 8 runde) este deschisă în același mod pentru orice tabel de înlocuire, dar tabelele de înlocuire puternice (de exemplu, date în ) fac un astfel de atac absolut nepractic.

Oamenii de știință autohtoni A. G. Rostovtsev și E. B. Makhovenko au propus în 2001 o metodă fundamental nouă de criptoanaliza (conform autorilor, este semnificativ mai eficientă decât criptoanaliza liniară și diferențială) prin formarea unei funcții obiective dintr-un text simplu cunoscut corespunzător textului cifrat și valoarea dorită. a cheii și găsirea extremului acesteia corespunzător valorii adevărate a cheii. Ei au găsit, de asemenea, o clasă mare de chei slabe ale algoritmului GOST 28147-89, care vă permit să deschideți algoritmul folosind doar 4 texte clare selectate și textele cifrate corespunzătoare cu o complexitate destul de scăzută. Criptanaliza algoritmului este continuată în lucrare.

În 2004, un grup de experți din Coreea a propus un atac prin care, folosind criptoanaliza diferențială pe chei asociate, este posibil să se obțină cu o probabilitate de 91,7% 12 biți ai unei chei secrete. Atacul necesită 235 de texte clare alese și 236 de operațiuni de criptare. După cum puteți vedea, acest atac este practic inutil pentru deschiderea reală a algoritmului.

Algoritmul definit de GOST 28147-89 are o lungime a cheii de criptare de 256 de biți. Acesta criptează informațiile în blocuri de 64 de biți (astfel de algoritmi se numesc algoritmi bloc), care sunt apoi împărțiți în două sub-blocuri de 32 de biți (N1 și N2) (Figura 1). Subblocul N1 este procesat într-un anumit mod, după care valoarea sa este adăugată la valoarea subblocului N2 (adăugarea se efectuează modulo 2, adică se aplică operația XOR logică - „exclusiv sau”), iar apoi subblocurile sunt schimbate. Această transformare se efectuează de un anumit număr de ori ("runde"): 16 sau 32 în funcție de modul algoritmului. În fiecare rundă sunt efectuate două operații.

Figura 1. Schema algoritmului GOST 28147-89.

Primul este cheiatul. Conținutul subblocului N1 este adăugat modulo 2 la partea de 32 de biți a cheii Kx. Cheie completă criptarea este reprezentată ca o concatenare de subchei pe 32 de biți: K0, K1, K2, K3, K4, K5, K6, K7. Una dintre aceste subchei este utilizată în procesul de criptare, în funcție de numărul rotund și de modul de operare al algoritmului.

A doua operație este înlocuirea mesei. După introducere, subblocul N1 este împărțit în 8 părți a câte 4 biți, valoarea fiecăruia fiind înlocuită în conformitate cu tabelul de înlocuire pentru această parte a subblocului. Subblocul este apoi rotit la stânga cu 11 biți.

Înlocuirile de tabele (Substitution box - S-box) sunt adesea folosite în algoritmii moderni de criptare, așa că merită explicat cum este organizată o astfel de operațiune. Valorile de ieșire ale blocurilor sunt scrise în tabel. Un bloc de date de o anumită dimensiune (în cazul nostru, de 4 biți) are propria sa reprezentare numerică, care determină numărul valorii de ieșire. De exemplu, dacă S-box arată ca 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 și un bloc de 4 biți „0100” a venit la intrare (valoarea 4), apoi, conform tabelului, valoarea de ieșire va fi 15, adică „1111” (0 a 4, 1 a 11, 2 a 2 ...).

Algoritmul definit de GOST 28147-89 prevede patru moduri de funcționare: înlocuire simplă, scalare, scalare cu feedback și generare de prefixe de imitație. Ei folosesc aceeași transformare de criptare descrisă mai sus, dar deoarece scopul modurilor este diferit, această transformare se realizează în fiecare dintre ele în mod diferit.

În modul de înlocuire simplă, cele 32 de runde descrise mai sus sunt efectuate pentru a cripta fiecare bloc de informații pe 64 de biți. În acest caz, subcheile pe 32 de biți sunt utilizate în următoarea secvență:

K0, K1, K2, K3, K4, K5, K6, K7, K0, K1 etc. - în rundele 1 până la 24;

K7, K6, K5, K4, K3, K2, K1, K0 - în rundele 25 până la 32.

Decriptarea în acest mod se realizează exact în același mod, dar cu o secvență ușor diferită de utilizare a subcheilor:

K0, K1, K2, K3, K4, K5, K6, K7 - în rundele 1 până la 8;

K7, K6, K5, K4, K3, K2, K1, K0, K7, K6 etc. - în rundele 9 până la 32.

Toate blocurile sunt criptate independent unul de celălalt, adică rezultatul criptării fiecărui bloc depinde numai de conținutul acestuia (blocul sursă corespunzător). Dacă există mai multe blocuri identice ale textului original (plat), blocurile de text cifrat corespunzătoare vor fi, de asemenea, aceleași, ceea ce oferă un Informatii utile pentru un criptoanalist care încearcă să spargă cifrul. Prin urmare, acest mod este utilizat în principal pentru a cripta cheile de criptare în sine (se implementează adesea scheme cu mai multe chei, în care, din mai multe motive, cheile sunt criptate una peste alta). Pentru a cripta informațiile în sine, sunt destinate alte două moduri de operare - gamma și gamma cu feedback.

În modul gamma, fiecare bloc de text simplu este adăugat pe biți modulo 2 la blocul gamma de cifră de 64 de biți. Cifrul gamma este o secvență specială, care se obține ca urmare a anumitor operații cu registrele N1 și N2.

  • 1. În registrele N1 și N2 se scrie umplerea lor inițială - o valoare de 64 de biți numită mesaj de sincronizare.
  • 2. Criptarea conținutului registrelor N1 și N2 (în acest caz, mesaje sincronizate) se realizează în modul de înlocuire simplă.
  • 3. Conținutul registrului N1 se adaugă modulo (232 - 1) cu constanta C1 = 224 + 216 + 28 + 24, iar rezultatul adunării se scrie în registrul N1.
  • 4. Conținutul registrului N2 se adaugă modulo 232 cu constanta C2 = 224 + 216 + 28 + 1, iar rezultatul adunării se scrie în registrul N2.
  • 5. Conținutul registrelor N1 și N2 este scos ca un bloc gamma de 64 de biți (în acest caz, N1 și N2 formează primul bloc gamma).

Dacă este necesar următorul bloc gamma (adică criptarea sau decriptarea trebuie să continue), reveniți la pasul 2.

Pentru decriptare, gamma este generată într-un mod similar, iar apoi textul cifrat și biții gamma sunt din nou XORed. Întrucât această operație este reversibilă, în cazul unui gamma generat corect, se obține textul original (Tabelul 1).

Tabelul 1. Criptare și decriptare în modul gamma

Pentru a dezvolta intervalul de criptare necesar pentru decriptare, utilizatorul care decriptează criptograma trebuie să aibă aceeași cheie și aceeași valoare a mesajului de sincronizare care au fost utilizate când informația a fost criptată. În caz contrar, nu veți putea obține textul original din cel criptat.

În majoritatea implementărilor algoritmului GOST 28147-89, mesajul de sincronizare nu este secret, dar există sisteme în care mesajul de sincronizare este același element secret ca și cheia de criptare. Pentru astfel de sisteme, lungimea efectivă a cheii algoritmului (256 de biți) este mărită cu încă 64 de biți ai mesajului de sincronizare secretă, care poate fi considerat și ca element cheie.

În modul feedback gamma, pentru a umple registrele N1 și N2, începând cu al 2-lea bloc, nu se folosește blocul gamma anterior, ci rezultatul criptării blocului de text simplu anterior (Figura 2). Primul bloc din acest mod este generat exact în același mod ca și cel anterior.

Figura 2. Generarea cifrului gamma în modul feedback gamma.

Având în vedere modul de generare a prefixelor de imitație, este necesar să se definească conceptul de subiect al generației. O falsificare este o sumă de control criptografică calculată folosind o cheie de criptare și concepută pentru a verifica integritatea mesajelor. La generarea unui prefix, se efectuează următoarele operații: primul bloc de 64 de biți al matricei de informații, pentru care se calculează prefixul, este scris în registrele N1 și N2 și criptat în modul de înlocuire simplă redusă (primele 16 se efectuează runde din 32). Rezultatul obținut este însumat modulo 2 cu următorul bloc de informații, salvând rezultatul în N1 și N2.

Ciclul se repetă până la ultimul bloc de informații. Conținutul de 64 de biți al registrelor N1 și N2, sau o parte a acestuia, rezultată din aceste transformări, se numește prefix de imitație. Mărimea prefixului este aleasă în funcție de fiabilitatea necesară a mesajelor: cu o lungime a prefixului r biți, probabilitatea ca o modificare a mesajului să treacă neobservată este de 2-r. Cel mai adesea, un prefix de 32 de biți este utilizat, adică jumătate din conținutul registrelor. Acest lucru este suficient, deoarece, ca orice sumă de control, prefixul de imitație este destinat în primul rând să protejeze împotriva distorsiunii accidentale a informațiilor. Pentru a proteja împotriva modificării intenționate a datelor, altele metode criptografice- În primul rând, o semnătură digitală electronică.

La schimbul de informații, prefixul de imitație servește ca un fel de mijloc suplimentar de control. Este calculat pentru textul simplu atunci când unele informații sunt criptate și sunt trimise împreună cu textul cifrat. După decriptare, se calculează o nouă valoare a prefixului de imitație, care este comparată cu cea trimisă. Dacă valorile nu se potrivesc, înseamnă că textul cifrat a fost distorsionat în timpul transmiterii sau au fost folosite chei incorecte în timpul decriptării. Prefixul de imitație este util în special pentru verificarea decriptării corecte a informațiilor cheie atunci când se utilizează scheme cu mai multe chei.

Algoritmul GOST 28147-89 este considerat un algoritm foarte puternic - în prezent, nu au fost propuse metode mai eficiente pentru dezvăluirea sa decât metoda „forță brută” menționată mai sus. Securitatea sa ridicată este atinsă în primul rând datorită lungimii mari a cheii - 256 de biți. Când se utilizează un mesaj de sincronizare secretă, lungimea efectivă a cheii este mărită la 320 de biți, iar secretul tabelului de înlocuire adaugă biți suplimentari. În plus, puterea criptografică depinde de numărul de runde de transformări, care, conform GOST 28147-89, ar trebui să fie 32 (efectul complet al dispersării datelor de intrare este atins după 8 runde).

Avantajele GOST 28147-89 sunt prezența protecției împotriva impunerii de date false (dezvoltarea inserării imitației) și același ciclu de criptare în toți cei patru algoritmi GOST.

Algoritm de criptare GOST 28147-89. Metodă simplă de înlocuire. — Arhiva WASM.RU

„Cât timp ești în viață, nu muri, uită-te la această lume.
Mulți aici au un suflet mort - sunt morți în interior.
Dar ei merg și râd, fără să știe că nu sunt acolo,
Nu te grăbi cu moartea, mi-a spus ea.

Aria, „Acolo sus”

2.1 rețele Feistel.
2.2 Cifra bloc GOST 28147-89

3.1 Informatie cheie
3.2 Pasul principal al transformării cripto

3.3 Cicluri de bază:32-Z, 32-R.

4.1 Implementarea etapei principale a transformării cripto
4.2 Creșterea vitezei algoritmului
5. Cerințe de informații cheie
6. Lista literaturii folosite
7. Mulțumiri.

Introducere.

Acest document este încercarea mea de a descrie metoda de înlocuire pur și simplu a algoritmului de criptare GOST 28147-89 în cel mai simplu limbaj, dar, cu toate acestea, alfabetizat din punct de vedere tehnic. Cât de bine am reușit, cititorul își va da cu părerea după ce a citit primele șase puncte.

Pentru ca munca mea să dea mai mult beneficiu Vă recomand să vă înarmați cu lucrările autorilor indicați în lista literaturii folosite. Se recomanda si un calculator, astfel incat sa aiba o functie de calcul al operatiei XOR, deoarece citirea articolului presupune că cititorul și-a propus să studieze acest algoritm de criptare. Deși este potrivit și ca instrument de referință, am scris acest articol tocmai ca tutorial.

Introducere în cifrurile bloc.

Înainte de a începe să luăm în considerare algoritmul, trebuie să ne familiarizăm cu istoria creării acestui tip de cifru. Algoritmul aparține categoriei de cifruri bloc, în arhitectura cărora informația este împărțită într-un număr finit de blocuri, cel final poate să nu fie complet. Procesul de criptare are loc exact peste blocurile complete, care formează textul cifrat. Blocul final, dacă este incomplet, este completat cu ceva (voi vorbi mai jos despre nuanțele adăugării lui) și este criptat în același mod ca și blocurile complete. Prin text cifrat, vreau să spun - rezultatul acțiunii funcției de criptare asupra unei anumite cantități de date pe care utilizatorul le-a trimis pentru criptare. Cu alte cuvinte, textul cifrat este rezultatul final al criptării.

Istoria dezvoltării cifrurilor bloc este asociată cu începutul anilor 70, când IBM, realizând nevoia de a proteja informațiile la transmiterea datelor prin canalele de comunicație computerizate, a început să implementeze program propriu cercetare științifică dedicată protecției informațiilor în rețelele electronice, inclusiv criptografia.

Un grup de cercetători - dezvoltatori ai companiei IBM, care a început să studieze sisteme de criptare cu o schemă de chei simetrice, a fost condus de Dr. Horst Feistel.

2.1 Rețele Feistel

Arhitectura noii metode de criptare propusă de Feistel în literatura clasică a fost numită „Arhitectura Feistel”, dar pe acest momentîn literatura rusă și străină, se folosește un termen mai consacrat - „rețeaua lui Feistel” sau rețeaua lui Feistel. Ulterior, conform acestei arhitecturi, a fost construit cifrul „Lucifer” – care a fost publicat ulterior și a provocat un nou val de interes în criptografie în general.

Ideea arhitecturii rețelei Feistel este următoarea: fluxul de informații de intrare este împărțit în blocuri de n biți în dimensiune, unde n este un număr par. Fiecare bloc este împărțit în două părți - L și R, apoi aceste părți sunt introduse într-un cifr de bloc iterativ, în care rezultatul etapei j-a este determinat de rezultatul etapei anterioare j-1! Acest lucru poate fi ilustrat cu un exemplu:

Orez. 1

Unde, funcția A este acțiunea principală a cifrului bloc. Poate fi o acțiune simplă, cum ar fi o operație XOR, sau poate avea un aspect mai complex, poate fi o secvență a unui număr de acțiuni simple - adăugare modulo, deplasare la stânga, înlocuire de elemente etc., în total acestea pași simpli formează așa-numitul - pasul principal al cripto-transformării.

Trebuie remarcat faptul că elementele cheie ale funcției sunt furnizarea de elemente cheie și operația XOR și cât de bine gândită este munca acestor operațiuni, vorbește despre puterea criptografică a cifrului în ansamblu.

Pentru ca ideea rețelelor Feistel să fie complet clară, luați în considerare cel mai simplu caz prezentat în Fig. orez. 1, unde în funcția A - vor efectua operațiunile „mod 2” (“xor”), dar aceasta protozoar caz, într-o situație mai gravă, de exemplu, ascunderea informațiilor de importanță națională, funcția A poate fi mai complexă (din câte am văzut, funcția A poate fi într-adevăr foarte complicată):

Date inițiale:

L=1110b, R=0101, K=1111b

Obțineți un text cifrat

1. (R + K) mod 2 4 = Smod, Smod = 0100b

2. (Smod + L) mod 2 = Sxor, Sxor = 1010b

3. L=R, R=Sxor

L=0101b, R=1010b

Să explicăm pașii noștri:

1. Această operație este modul de adăugare 2 4 . În practică, o astfel de operație se rezumă la o simplă adunare, în care trebuie să adunăm două numere și să ignorăm transportul la a 5-a cifră. Deoarece, dacă punem exponenți peste cifrele reprezentării binare a unui număr, va exista un indicator de patru peste a cincea cifră, aruncați o privire la figura de mai jos, care arată acțiunile operației noastre:

Orez. 2

Aici am indicat exponenții cu o săgeată, după cum puteți vedea, rezultatul ar fi trebuit să fie 10100, dar deoarece transportul este ignorat în timpul operațiunii mod 2 4, obținem 0100.

2. Această operație în literatură se numește mod 2, în limbaj de asamblare este implementată de comandă XOR. Dar numele său mai corect este mod 2 1 . Fără această operațiune unică, cu greu este posibil să se construiască un algoritm de criptare rapid, ușor de implementat și, în același timp, să fie destul de rezistent la criptografie. Unicitatea acestei operațiuni constă în faptul că este inversul în sine! De exemplu, dacă numărul A este XOR cu numărul B, rezultatul va fi C, în viitor este suficient să re-XOR numerele B și C împreună pentru a obține valoarea anterioară a lui A!

În această operație, am obținut 1010 având numerele 1110 și 0100, pentru a obține înapoi 1110, este suficient să XOR numerele 0100 și 1010 împreună! Mai multe detalii despre această operațiune găsiți în articol, care este încorporat pe site. www.wasm.ru, « Ghid elementar pentruAlgoritmi de detectare CRC_error» autorul care Ross N. Williams. Există un paragraf în această lucrare - " 5. Aritmetică binară fără transporturi". În acest articol este descrisă operația xor! Exclam pentru că în acest articol această operațiune este descrisă în așa fel încât cititorul nu doar să înțeleagă cum funcționează această operațiune, ci chiar să o înceapă vezi, auzi si simti!

3. Această acțiune este necesară pentru ca atunci când decriptați din textul cifrat, să puteți obține valorile originale.

2.2 Cifrul bloc GOST 28147-89

Algoritmul de criptare GOST 28147 - 89 aparține categoriei de cifruri bloc care operează pe arhitectura de rețea echilibrată Feistel, unde două părți ale blocului de informații selectat sunt de dimensiuni egale. Algoritmul a fost dezvoltat în măruntaiele celui de-al optulea departament al KGB, acum transformat în FAPSI și a fost consacrat ca standard de criptare al Federației Ruse încă din 1989 sub URSS.

Pentru munca aceasta metoda algoritm, este necesar să spargeți informațiile în blocuri de 64 de biți. Generați sau introduceți în sistemul de criptare următoarele informații cheie: cheie și tabel de înlocuire. Alegerea cheii și a tabelului de înlocuire pentru criptare ar trebui luată foarte în serios, deoarece. acesta este fundamentul securității informațiilor dvs. Despre ce cerințe sunt impuse cheii și tabelul de substituții, consultați paragraful „Cerințe pentru informațiile cheie”.

Când luăm în considerare metoda, nu ne vom concentra asupra acestui lucru, deoarece. acest articol, așa cum am spus mai sus, a fost scris cu scopul de a învăța cititorul cum să cripteze datele folosind metoda simplă de înlocuire acest algoritm criptare, dar cu siguranță vom aborda această problemă la sfârșitul articolului.

minim teoretic.

3.1 Informații cheie

După cum am spus mai sus, următorii sunt implicați activ în criptarea datelor:

3.1.1. Cheia este o secvență de opt elemente a câte 32 de biți fiecare. Mai departe, vom nota simbolul K și elementele din care constă - k1,k2,k3,k4,k5,k6,k7,k8.

3.1.2 Tabelul de substituție este o matrice de opt rânduri și șaisprezece coloane, denumită în continuare Hij. Fiecare element de la intersecția rândului i și coloanei j are 4 biți.

3.2 Etapa principală a transformării cripto

Acțiunea principală în procesul de criptare este pasul principal al transformării cripto. Aceasta nu este altceva decât o acțiune de criptare a datelor folosind un anumit algoritm, doar numele introdus de dezvoltatori a fost prea greoi.

Înainte de a începe criptarea, blocul este împărțit în două părți L și R, câte 32 de biți fiecare. Elementul cheie este selectat și numai atunci aceste două părți ale blocului sunt alimentate, elementul cheie este tabelul de înlocuire în funcția pasului principal, rezultatul pasului principal este o iterație a ciclului de bază, care va fi discutată în paragraful următor. Pasul principal constă din următorii pași:

  1. Partea de adăugare a blocului R este adăugată elementului cheie K mod 2 32 . Am descris o operație similară mai sus, aici același lucru este doar că exponentul nu este „4”, ci „32” - rezultatul acestei operații va fi notat de Smod în viitor.
  2. Împărțim rezultatul Smod obținut anterior în patru elemente de biți s7,s6,s5,s4,s3,s2,s1,s0 și îl introducem în funcția de înlocuire. Înlocuirea este după cum urmează: se selectează elementul Smod - s i, de la început pornim de la elementul cel mai de jos, și îl înlocuim cu valoarea din tabelul de înlocuire pentru rândul și coloana i indicată de valoarea elementului s i . Trecem la s i +1 element și facem același lucru și continuăm până când înlocuim valoarea ultimului element Smod - rezultatul acestei operații va fi notat ca Ssimple.
  3. În această operație, valoarea lui Ssimple este deplasată ciclic la stânga cu 11 biți și obținem Srol.
  4. Selectăm a doua parte a blocului L și adăugăm mod 2 cu Srol, ca urmare avem Sxor.
  5. În această etapă, partea L a blocului devine egală cu valoarea părții R, iar partea R la rândul ei este inițializată cu rezultatul Sxor, iar aceasta completează funcția pasului principal!

3.3 Cicluri de bază: „32-Z”, „32-R”.

Pentru a cripta informațiile, este necesar să le împărțiți în blocuri de 64 de biți, desigur, ultimul bloc poate fi mai mic de 64 de biți. Acest fapt este călcâiul lui Ahile al acestei metode de „înlocuire simplă”. Deoarece adăugarea sa la 64 de biți este o sarcină foarte importantă pentru a crește puterea criptografică a textului cifrat, acest loc sensibil, dacă este prezent în matricea de informații, dar este posibil să nu fie (de exemplu, un fișier de 512 octeți în dimensiune !), ar trebui tratat cu mare responsabilitate!

După ce ați împărțit informațiile în blocuri, ar trebui să împărțiți cheia în elemente:

K = k1,k2,k3,k4,k5,k6,k7,k8

Criptarea în sine constă în utilizarea așa-numitelor cicluri de bază. Care, la rândul lor, includ al n --lea număr de pași de bază de cripto-transformare.

Ciclurile de bază sunt, cum să spun, marcate: n - m. Unde n este numărul de pași de cripto-transformare de bază din bucla de bază și m este „tipul” buclei de bază, adică despre ce este vorba, criptarea „Z” sau criptarea „R” a datelor.

Ciclul de criptare de bază 32–3 constă din 32 de pași criptografici de bază. Blocul N și elementul tastei K sunt introduse în funcția care implementează acțiunile pasului, iar primul pas are loc cu k1, al doilea peste rezultat cu elementul k2 etc. conform următoarei scheme:

k1,k2,k3,k4,k5,k6,k7,k8,k1,k2,k3,k4,k5,k6,k7,k8,k1,k2,k3,k4,k5,k6,k7,k8k8,k7, k6,k5,k4,k3,k2,k1

Procesul de decriptare 32-P decurge într-un mod similar, dar elementele cheie sunt alimentate în ordine inversă:

k1,k2,k3,k4,k5,k6,k7,k8,k8,k7,k6,k5,k4,k3,k2,k1,k8,k7,k6,k5,k4,k3,k2,k1,k8, k7,k6,k5,k4,k3,k2,k1

Practică.

4.1 Implementarea etapei principale de transformare cripto

După ce ne-am familiarizat cu teoria modului de criptare a informațiilor, este timpul să vedem cum funcționează criptarea în practică.

Date inițiale:

Să luăm un bloc de informații N = 0102030405060708h, aici părțile L și R sunt egale:

L = 01020304h, R = 05060708h, luați cheia:

K=' ca28 zw37 q839 7342ui23 8e2t wqm2 ewp1' (acestea sunt coduri ASCII, pentru a vizualiza reprezentarea hexazecimală, puteți deschide acest fișier în modul de vizualizare în Comandant total apăsând tasta " F3” și apoi tasta ” 3 "). În această cheie, valorile elementului vor fi:

k1 = „as28”, k2 = „zw37”, k3 = „q839”, k4 = „7342”

k5 = „ui23”, k6 = „8e2t”, k7 = „wqm2”, k8 = „ewp1”

Luați, de asemenea, următorul tabel de înlocuire:

Orez. 3

Aici rândurile sunt numerotate de la 0 la 7, coloanele de la 0 la F.

Avertizare: Toate informațiile, inclusiv cheia cu tabelul de substituție, sunt luate ca exemplu pentru luarea în considerare a algoritmului!

Folosind „Date inițiale”, trebuie să obțineți rezultatul acțiunii pasului principal al transformării cripto.

1. Selectați partea R = 05060708h și elementul cheie k1 = ‘as28’, în formă hexazecimală elementul cheie va arăta astfel: 61733238h. Acum facem operația modului de însumare 2 32:

Orez. 4

După cum puteți vedea în figură, nu am transferat la 33 de biți marcați cu roșu și cu exponentul " 32 ". Și dacă am avea alte valori ale lui R și elementul cheie, acest lucru s-ar putea întâmpla și atunci l-am ignora, iar în viitor am folosi doar biții marcați cu galben.

Eu efectuez o astfel de operație cu comanda assembler adăuga:

; eax=R, ebx='as28'

Rezultatul acestei operațiuni este Smod = 66793940h

2. Acum cea mai complicată operație, dar dacă te uiți cu atenție, nu mai este atât de înfricoșătoare pe cât pare la început. Să ne imaginăm Smod în următoarea formă:

Orez. 5

Am încercat să vizualizez elementele Smod din figură, dar voi explica oricum:

s0 = 0, s1 = 4, s2 = 9 etc.

Acum, pornind de la elementul cel mai de jos s0, facem o înlocuire. Amintind paragraful 3.2 Etapa principală a transformării cripto» i este un rând, s i este o coloană, căutăm o valoare în rândul zero și coloana zero:

Fig.6

Deci valoarea actuală a Smod nu este 6679394 0 h și 6679394 5 h.

Procedăm la înlocuirea s1, adică. patru. Folosind primul rând și a patra coloană (s1= 4!). Să ne uităm la poză:

Orez. 7

Acum valoarea este Smod, nu 667939 4 5h, 667939 2 5h. Presupun că acum algoritmul de înlocuire este clar pentru cititor și pot spune că după rezultatul final al lui Ssimple va avea următoarea valoare - 11e10325h.

Voi vorbi despre modul în care acest lucru este cel mai ușor de implementat sub formă de comenzi de asamblare mai târziu în paragraful următor, după ce voi vorbi despre tabelul extins.

  1. Trebuie să deplasăm valoarea Ssimple rezultată cu 11 biți la stânga.

Orez. 8

După cum puteți vedea, această acțiune este destul de simplă și este implementată de o comandă în limbaj de asamblare - rostogolire iar rezultatul acestei operațiuni Srol este 0819288Fh.

4. Acum rămâne partea L a blocului nostru de informații către XOR cu valoarea Srol. Iau calculator de la w2k sp4 și primesc Sxor = 091b2b8bh.

5. Această acțiune este finală și pur și simplu atribuim, curățăm R valoarea părții L și inițializam partea L cu valoarea lui Sxor.

Rezultat final:

L=091b2b8bh, R=01020304h

4.2 Creșterea vitezei algoritmului

Acum să vorbim despre optimizarea algoritmului pentru viteză. La implementarea unui proiect, trebuie să ținem cont de faptul că un program care funcționează cu registre mai des decât cu memorie funcționează cel mai rapid și aici această judecată este și ea foarte importantă, deoarece. peste un bloc de informații până la 32 de pași de criptare!

Când am implementat algoritmul de criptare în programul meu, am făcut următoarele:

1. Partea selectată a blocului L în registrul eax și R în edx.

2. Inițializat în registrul esi cu adresa cheii extinse, mai multe despre aceea de mai jos.

3. Am atribuit registrului ebx valoarea adresei tabelului de substituție extins, mai multe despre asta mai jos

4. A trecut informațiile de la punctele 1,2, 3 la funcția ciclului de bază 32 - Z sau 32 - R, în funcție de situație.

Dacă vă uitați la schema de furnizare a elementelor cheie din paragraful „ Cicluri de bază: „32-Z”, „32-R””, atunci cheia noastră pentru ciclul de bază 32 - Z poate fi reprezentată după cum urmează:

K 32-Z =

'as28','zw37','q839','7342','ui23','8e2t','wqm2','ewp1',

'as28','zw37','q839','7342','ui23','8e2t','wqm2','ewp1',

'ewp1','wqm2','8e2t','ui23','7342','q839','zw37','as28'

Acestea. de la început mergi k1,k2,k3,k4,k5,k6,k7,k8 - ca28', 'zw37', 'q839', '7342', 'ui23', '8e2t', 'wqm2', 'ewp1' Această secvență se repetă de trei ori. Apoi elementele merg în ordine inversă, adică: k8,k7,k6,k5,k4,k3,k2,k1 - „ewp1”, „wqm2”, „8e2t”, „ui23”, „7342”, „q839”, „zw37”, „as28”.

Am pre-aranjat elementele din matrice în ordinea în care ar trebui să fie servite în 32 - Z. Astfel, am crescut memoria necesară per tastă, dar m-am salvat de unele procese de gândire de care nu aveam nevoie și am crescut viteza algoritm, pentru reducerea timpului de acces la memorie! Aici am descris doar cheia pentru 32 - Z, pentru ciclul 32 - R am făcut același lucru, dar folosind o schemă diferită pentru furnizarea elementelor, pe care am descris-o și în paragraful " Cicluri de bază: „32-Z”, „32-R».

Este timpul să descriem implementarea funcției de înlocuire, așa cum am promis mai sus. Nu aș putea descrie mai devreme, pentru că. aceasta necesită introducerea unui nou concept - un tabel de substituție extins. Nu pot să-ți explic ce este. În schimb, vă voi arăta și vă puteți formula singur ce este - un tabel extins de înlocuire?

Deci, pentru a înțelege ce este un tabel de substituție extins, avem nevoie de un tabel de înlocuire, de exemplu, îl voi lua pe cel prezentat în Fig. 3.

De exemplu, trebuia să înlocuim numărul 66793940h. O voi prezenta sub următoarea formă:

Orez. 9

Acum, dacă luăm elementele s1,s0, i.e. octet mic, atunci rezultatul funcției de înlocuire va fi 25h! După ce am citit articolul lui Andrey Vinokurov, pe care l-am citat în paragraful „ Lista literaturii folosite”, veți descoperi de fapt că dacă luați două linii, puteți obține o matrice care vă permite să găsiți rapid elemente de înlocuire folosind o comandă de asamblare xlat. Ei spun că este posibil într-un alt mod, mai rapid, dar Andrey Vinokurov a petrecut aproximativ patru ani cercetând algoritmi rapizi pentru implementarea GOST! Nu cred că ar trebui să reinventezi roata când există deja.

Deci, despre matrice:

Să luăm primele două linii, zero și prima, și să creăm o matrice de 256 de octeți. Acum observăm o caracteristică că, dacă trebuie să convertiți 00h, atunci rezultatul va fi 75h (pe baza Fig. 3) - puneți această valoare în matrice la offset 00h. Luăm valoarea 01h, rezultatul funcției de înlocuire este 79h, o punem în matrice la offset 01 și tot așa până la 0FFh, care ne va da 0FCh, pe care îl vom pune în matrice la offset 0FFh. Așa că am obținut un tabel extins de înlocuiri pentru primul grup de șiruri: primul și zero. Dar mai sunt trei grupuri: a doua pagina 2, pagina 3, a treia pagina 4, pagina 5, a patra pagina 6, pagina 7. Cu aceste trei grupuri procedăm în același mod ca și cu primul. Rezultatul este un tabel de înlocuire extins!

Acum puteți implementa un algoritm care va efectua înlocuirea. Pentru asta luăm codurile sursă postat de Andrey Vinokurov pe pagina sa, vezi „ Bibliografie».

lea ebx,extented_table_simple

mută eax,[pune numărul de înlocuit]

adăugați ebx,100h; mergeți la următoarele două noduri

sub ebx,300h ; astfel încât în ​​viitor ebx să indice tabelul

Acum încă o caracteristică, nu numai că am înlocuit acțiunile anterioare, dar am deplasat și numărul cu 8 biți la stânga! Trebuie doar să mutam numărul încă 3 biți la stânga:

si obtinem rezultatul operatiei rol eax,11!

Nu mai pot adăuga nimic despre optimizare, singurul lucru pe care pot sublinia ceea ce am spus mai sus este să folosesc registrele mai des decât accesele de memorie. Cred că aceste cuvinte sunt doar pentru începători, oamenii cu experiență înțeleg acest lucru foarte bine fără cuvintele mele.

Cerințe privind informațiile cheie.

După cum se precizează în articolul lui Andrey Vinokurov, cheia este selectată în funcție de două criterii:

Criteriul pentru distribuția equiprobabilă a biților între valorile 1 și 0. De obicei, criteriul pentru distribuția equiprobabilă a biților este criteriul lui Pearson ("chi-pătrat").

Aceasta înseamnă cheia, în principiu orice număr poate. Adică, atunci când se formează următorul bit al cheii, probabilitatea inițializării acestuia cu unu sau zero este 50/50!

Vă rugăm să rețineți că cheia are opt elemente, fiecare de 32 de biți, deci sunt 32 * 8 = 256 de biți în total în cheie și numărul chei posibile 2256! Nu te lovește?

criterii de serie.

Dacă ne uităm la cheia noastră, pe care am dat-o în paragraful " 4.1 Implementarea etapei principale de transformare cripto”, atunci veți observa că următoarea intrare este adevărată:

Orez. 10

Într-o frază, valoarea lui k 1 nu trebuie repetată nici în k 2 , nici în niciun alt element al cheii.

Adică, cheia pe care am ales-o ca luare în considerare a algoritmului de criptare, îndeplinește bine cele două criterii de mai sus.

Acum despre alegerea tabelului de înlocuire:

Acum să vorbim despre cum să alegeți tabelul de înlocuire potrivit. Principala cerință pentru alegerea tabelelor de substituție este fenomenul de „nerepetabilitate” a elementelor, fiecare dintre ele având o dimensiune de 4 biți. După cum ați văzut mai sus, fiecare rând al tabelului de înlocuire este format din valorile 0h, 1h, 2h, 3h, ..., 0fh. Deci, principala cerință este ca fiecare linie să conțină valorile 0h, 1h, 2h, ... , 0fh și fiecare astfel de valoare într-o singură instanță. De exemplu, secvența:

1 2 3 4 5 6 7 8 9 A B C D E F

Îndeplinește pe deplin această cerință, dar totuși! Nu este recomandat să selectați o astfel de secvență ca șir. Pentru că dacă furnizați o valoare intrării unei funcții care se bazează pe un astfel de șir, atunci veți obține aceeași valoare la ieșire! Nu crezi? Apoi luați numărul 332DA43Fh și opt astfel de linii ca tabel de înlocuire. Efectuați operația de înlocuire și vă asigur că ieșirea va fi numărul 332DA43Fh! Adică același lucru pe care l-ați supus la intrarea operației! Și acesta nu este un semn de bună formă în criptare, și nu-i așa?

Aceasta a fost o cerință, următorul criteriu spune că - fiecare bit al blocului de ieșire trebuie să fie independent statistic de fiecare bit al blocului de intrare!

Cum arată mai ușor? Și iată cum, de exemplu, am ales elementul s0 = 0Fh, 01111b din numărul de mai sus. Probabilitatea ca acum să înlocuim primul bit cu unul sau cu zero este 0,5! Probabilitatea înlocuirii celui de-al doilea, al treilea și al patrulea bit, fiecare bit, considerat separat, cu unuri sau zerouri este, de asemenea, de 0,5. Atunci când alegem s1 = 0Eh, vom înlocui probabilitatea că suntem un bit zero, iar acesta este „0” , cu zero sau unul prea este egal - 0,5! Astfel, conform acestui criteriu, nu există o regularitate între înlocuirea biților zero ai elementelor s0, s1! Da, ai putea înlocui cu unele, dar ai putea pune și zerouri.

Pentru a evalua tabelul conform acestui criteriu, puteți construi un tabel de coeficienți de corelație calculati prin formula:

Dacă p = 1, atunci valoarea bitului j la ieșire este egală cu valoarea bitului i la intrare pentru orice combinație de biți la intrare;

Dacă p = -1, atunci valoarea bitului j la ieșire este întotdeauna inversul bitului i de intrare;

Dacă p = 0, atunci bitul de ieșire j ia valorile 0 și 1 cu probabilitate egală pentru orice valoare fixă ​​a bitului de intrare i.

Să luăm un exemplu cu o singură linie:

Să-l împărțim în componente:

Calculăm un coeficient folosind formula de mai sus. Pentru a înțelege mai ușor cum se face acest lucru, voi explica mai detaliat:

Luăm bitul 0 al numărului 0 (0) la intrare și bitul 0 al numărului 0 la ieșire (1) și efectuăm operația 0 XOR 1 = 1.

Luăm al 0-lea bit al primului număr (1) la intrare și al 0-lea bit al primului număr la ieșire (1) și efectuăm operația 1 XOR 1 = 0.

Luăm al 0-lea bit al celui de-al 2-lea număr (0) la intrare și al 0-lea bit al celui de-al 2-lea număr la ieșire (0) și efectuăm operația 0 XOR 0 = 0.

Luăm al 0-lea bit al celui de-al 3-lea număr (1) la intrare și al 0-lea bit al celui de-al 3-lea număr la ieșire (1) și efectuăm operația 1 XOR 1 = 0.

După efectuarea secvenţială a operaţiilor XOR într-o astfel de secvenţă, numărăm numărul tuturor valorilor diferite de zero, obţinem valoarea 6. Prin urmare, P 00 = 1-(6/2 4-1) = 0,25. Deci, s-a dovedit că valoarea bitului 0 la ieșire este egală cu valoarea bitului 0 la intrare în 4 cazuri din 16;

Tabelul final de cote:

După cum se poate vedea din tabelul coeficienților de corelație, bitul 3 la intrare este inversat față de bitul 0 la ieșire în 14 cazuri din 16, ceea ce este 87,5% Acest lucru nu mai este acceptabil pentru sistemele de criptare normale. Pentru o schimbare, să luăm un alt exemplu:

Tabelul de coeficienți va fi după cum urmează (cui nu-i lene să recalculeze)

Ei bine, lucrurile stau și mai rău în acest tabel - biții 1 și 2 ai grupului rămân neschimbați! Criptoanalistul are unde să se întoarcă Ținând cont de toate aceste cerințe, o simplă enumerare (“front-on”) a găsit tabele de permutare corespunzătoare teoriei specificate (azi - 1276 de combinații) Iată câteva dintre ele:

09 0D 03 0E-06 02 05 08-0A 07 00 04-0C 01 0F 0B

00 05 0A 07-03 08 0F 0C-0E 0B 04 09-0D 06 01 02

06 0B 0F 00-0C 01 02 0D-08 07 09 04-05 0A 03 0E

04 0E 00 09-0B 01 0F 06-03 0D 07 0A-0C 02 08 05

04 02 08 0E-05 0F 03 09-0B 01 0D 07-0A 0C 06 00

07 03 09 0C-08 00 06 0F-0E 04 01 0A-0D 0B 02 05

06 0F 03 08-0D 04 0A 01-09 02 05 0C-00 0B 0E 07

0C 06 08 01-03 09 07 0E-0B 05 0F 02-04 0A 00 0D

04 0B 09 06-0E 01 00 0F-0A 05 03 0C-0D 02 07 08

00 0E 0F 01-07 08 09 06-04 0B 0A 05-03 0D 0C 02

0F 09 01 07-04 0A 08 06-0E 00 02 0C-05 03 0B 0D

0A 03 04 01-05 0C 0B 0E-08 06 0F 0D-07 09 00 02

0B 06 0F 01-04 0A 08 05-00 0D 0C 02-07 09 03 0E

0C 03 02 08-0D 06 0B 05-07 09 04 0F-0A 00 01 0E

02 0B 0F 04-09 00 06 0D-05 0E 01 08-0C 07 0A 03

Lista literaturii folosite.

  1. Articol de Andrey Vinokurov:

Algoritmul de criptare GOST 28147-89, utilizarea și implementarea acestuia

pentru calculatoare Platforme Intel x86.

Iată codurile sursă pentru implementarea algoritmului de criptare.

  1. Articol de Horst Feistel:

Criptografie și securitate informatică.

(poate fi găsit la aceeași adresă ca articolul precedent)

  1. Ross N. Williams:

Un ghid elementar pentru algoritmii de detectare a erorilor CRC

Postat pe site www.wasm.ro.

Mulțumiri.

Aș dori să-mi exprim recunoștința tuturor vizitatorilor forumului www.wasm.ru. Dar aș dori să-i mulțumesc în special lui ChS, care în prezent este cunoscut sub numele de SteelRat, el m-a ajutat să înțeleg lucruri pe care probabil nu le-aș înțelege niciodată, precum și m-a ajutat să scriu paragraful: „ Cerințe de informații cheie”, partea principală a acestui paragraf a fost scrisă de el. De asemenea, îi sunt profund recunoscător angajatului KSTU. UN. Tupolev Anikin Igor Vyacheslavovich și ar fi un păcat să nu mai vorbim de Chris Kaspersky, pentru faptul că este, și Volodya / wasm.ru pentru instrucțiunile sale. Oh, și primesc de la el. De asemenea, vreau să remarc Sega-Zero / Callipso pentru că mi-au adus niște junglă matematică în minte.

Acesta este poate tot ce aș vrea să vă spun.

Aș fi recunoscător pentru critici sau întrebări legate de acest articol sau doar sfaturi. Datele mele de contact: [email protected], ICQ - 337310594.

Cu stimă, Evil's Interrupt.

P.S.: Nu am încercat să întrec pe nimeni cu acest articol. A fost scris cu intenția de a facilita studiul GOST, iar dacă aveți dificultăți, asta nu înseamnă că eu sunt de vină pentru asta. Fii rezonabil și ai răbdare, toate cele bune pentru tine!



Se încarcă...
Top