Sunteți pe pagina 1din 16

30.

STRUCTURI DE DATE N SECURIZAREA


INFORMAIEI
30.1 Structuri
informaiei

algoritmi

utilizai

securizarea

Structurile de date folosite n securizarea informaiilor de obicei sunt


structuri de date neconvenionale i se implementeaz la diferite niveluri
ale aplicaiei. Se observ, pentru a securiza informaia, structurile de date
se implementeaz la orice nivel al aplicaiei. Se ntlnesc patru niveluri
importante de implementare a structurilor de date:
1. la nivelul operaiilor matematice pe care le implementeaz
algoritmul structuri de date algebrice implementate prin
programare cu ajutorul claselor i obiectelor (inele algebrice n
cmp finit Galois Field (GF), inele polinomiale sau inelele claselor
de resturi);
2. la nivelul transformrilor de prelucrare a datelor, sau schema
algoritmului (folosirea reelelor Feistel, sau a unor reele proprii i
combinate sau transformri proprii);
3. la nivelul modului de folosire a algoritmilor simetrici n practic (de
obicei se ntlnesc dou moduri principale de utilizare cifrarea
bloc i cifrarea secvenial);
4. nivelul protocoalelor de transmisie a datelor i al memorrii
certificatelor publice (de obicei aceste structuri a pachetelor de
date sau a certificatelor se descriu n ASN.1/DER Abstract
Syntax Notation 1 /Definite Encoding Rules).
n criptografie din punct de vedere matematic se ntlnesc
urmtoarele tipuri de algoritmi folosii pentru:
funcii de dispersie (digerarea mesajului) MD2, MD4, MD5
(Message Digest), SHA-1 (Secure Hash Algoritm);
algoritmi care fundamenteaz sisteme criptografice simetrice
(cele ce opereaz cu blocuri pe 64 bii DES, 3DES, FEAL, LOKI
i cele noi din standardul AES (Advanced Encryption Standard)
AES-Rijndael, Twofish, Blowfish, Serpent, RC6, DEAL, MARS,
FROG, LOKI-97);
algoritmi ce fundamenteaz sisteme criptografice asimetrice
pentru criptare sau semntur electronic (RSA, El Gammal,
DSA).

30.2 Structuri de date la nivelul operaiilor matematice


La primul nivel al operaiilor matematice se genereaz structuri
de date specifice, care se folosesc n algoritmi criptografici. Pentru o
nelegere mai bun se prezint succint operaia de adunare i nmulire n
inelul algebric cu mulimea numerelor n cmp finit GF(23), Galois Field
(256).
n GF(23) se reprezint numere de la 0 la 255, adic 256 de numere.
Valoarea maxim care se poate reprezenta de un byte (octet) fr semn
este 255 (toi cei 8 bii cu valoarea 1 => 20+21+22+23+24+25+26+27 = 28-

1 = 255). Pe de o parte se va opera cu bii, iar pe de alt parte se va opera


cu polinoame matematice.
De exemplu valoare 7 n binar se reprezint 0000 0111 pe un octet
sau
n
forma
polinomial
este:
b(x)
=
0*x7+0*x6+0*x5+0*x4+0*x3+1*x2+1*x1+1*x0. Dac x=2 nseamn c b(2)
= 7. Cu alte cuvinte, orice numr din intervalul 0..255, adic un octet b cu
biii b7 b6 b5 b4 b3 b2 b1 b0 se reprezint ca un polinom algebric cu
coeficienii bi n mulimea {0, 1}:
b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b0

(30.1)

a) adunarea este echivalent cu XOR (SAU exclusiv) pe bii sau


adunarea modulo 2. De exemplu, dac se adun urmtoarele
numere n hexazecimal: 57+83 = D4 sau (fiecare cifr n
hexazecimal ocup 4 bii) 01010111 + 10000011 = 11010100
sau n reprezentare polinomial (x6+x4+x2+x+1) + (x7+x+1) =
x7+x6+x4+x2. Aceast operaie se implementeaz la nivel de octet
foarte uor n C/C++, folosind XOR pe bii (operatorul ^).
Mulimea {0, 1, , 255} mpreun cu operaia XOR formeaz grup
abelian (operaia este intern, asociativ, comutativ, exist
elementul neutru 00, exist elementul invers nsui elementul
este inversul lui);
b) nmulirea nu mai are echivalen cu o operaie pe bii existent la
procesoarele actuale. n reprezentarea polinomial, multiplicarea
nmulirea n GF(28) corespunde cu nmulirea a dou polinoame
modulo un polinom ireductibil de grad 8. Un polinom ireductibil
nseamn un polinom care nu are ali divizori n afar de 1 i el
nsui. De exemplu pentru Rijndael (algoritmul acceptat ca
standard AES Advanced Encryption Standard n S.U.A),
polinomul de grad 8 ireductibil este de numit m(x) i are forma:
m(x) = x8+x4+x3+x+1, adic 11B n reprezentare hexazecimal.
De exemplu: 57*83=C1, n hexazecimal sau polinomial:
((x6+x4+x2+x+1)*(x7+x+1)) = x13+x11+x9+x8+x7+x7 +x5 +x3+x2+x+x6 +x4
+x2+x +1= x13+x11+x9+x8+x6+x5+x4+x3+1 x13+x11+x9+x8+x6+x5+x4+x3+1
(30.2)
modulo m(x) = x7+x6+1
n programare nmulirea a dou numere din GF(28) se face ca sum
exponenial a 2 logaritmi n baz numr prim n GF(28). Concret, se
genereaz ntr-un vector alog[] de mrime 256 toate valorile posibile a unui
numr prim din GF(28). Orice numr prim din GF(28) ridicat la putere cu
toate celelalte numere mod 11B genereaz tot cmpul finit. nmulirea cu
3 adic x+1 nseamn b(x)*(x+1) = b(x)*x+b(x), deoarece GF(28) este
grup abelian i fa de a doua operaie. Mai mult b(x)*x nseamn
deplasarea la stnga cu un bit i n caz c apare transport pe ultimul bit se
face XOR cu 11B.
Codul surs este urmtorul:

#include <stdio.h>
class inelGF {
public:
unsigned char val;//1 octet fara semn adica 8 biti
int alog[256];//functia exponentiala f(y) = 3y = (x+1)y
// f(4) = (x+1)*(x+1)*(x+1)*(x+1)
int log[256];//functia logaritm inversa exponentialei
//constructorii
inelGF(int b=0);
inelGF(unsigned char b);
//metodele folosite
void generareALOGSiLog();
void setVal(unsigned char b);
unsigned char getVal();
//adunare
inelGF operator+ (inelGF &);
//inmultire
inelGF operator* (inelGF &);
//atribuire
inelGF operator= (inelGF &);
};
inelGF::inelGF(int b) {
this->val = (unsigned char)b;
this->generareALOGSiLog();
}
inelGF::inelGF(unsigned char b) {
this->val = b;
this->generareALOGSiLog();
}
void inelGF::generareALOGSiLog() {
alog[0]=1;
int i=0,j=0;
int ROOT = 0x11B;
for(i=1;i<256;i++) {
j=(alog[i-1] << 1)^alog[i-1];
if((j&0x100)!=0)j=j^ROOT;
alog[i]=j;
}
for (i = 1; i < 256; i++) log[alog[i]] = i;
}
void inelGF::setVal(unsigned char b) {
this->val = b;
}
unsigned char inelGF::getVal() {
return this->val;
}
inelGF inelGF::operator+(inelGF &igf2) {
inelGF temp;
temp.val = this->val^igf2.val;
return temp;
}
inelGF inelGF::operator*(inelGF &igf2) {
inelGF temp;
int t1 = (int) temp.val;
int t2 = (int) this->val;
int t3 = (int) igf2.val;
(t2 != 0 && t3 != 0) ?t1 = this->alog[(log[t2 & 0xFF] + log[t3 &
0xFF]) % 255] : t1 = 0;

//adica
7*5
=
alog[log[7]+log[5]];//in
mod
normal
logaritmul //pastreaza toate propietatile in acest inel algebric ca
peste //numerele reale
temp.val = (unsigned char)t1;
return temp;
}
inelGF inelGF::operator= (inelGF &igf2) {
this->val = igf2.val;
return *this;
}
void main()
{
inelGF a(87);
inelGF b(131);
inelGF rez1, rez2;
rez1 =(a + b);
rez2 =(a * b);
printf(" Afisez rezultat adunare: %d\n",rez1.val);
printf(" Afisez rezultat inmultire: %d\n",rez2.val);
}

Acest exemplu este o clas creat n C++, unde sunt implementate


cele dou operaii i mpreun cu cmpul Galois formeaz un inel algebric.
n realitate pentru reutilizarea codului se elaboreaz biblioteci cu
clase foarte puternice n limbaje de asamblare pentru diferite procesoare i
n limbaje evoluate precum C/C++, C# i Java. Clase foarte folositoare din
practic se dovedesc cele pentru numere ntregi foarte mari, BigInt pentru
algoritmi cu cheii publice, i clase pentru inele i corpuri algebrice n cmp
finit, i clase pentru matrice, vectori i liste cu informaii utile n GF(28).

30.3 Structuri de date la nivelul etapelor algoritmului de


criptare/decriptare
La al doilea nivel, adic al operaiilor de ansamblu al algoritmului sau
schema algoritmului (folosirea reelelor Feistel, sau a unor reele proprii i
combinate sau transformri proprii), apar cele mai diverse structuri de date.
n figurile 30.1, 30.2 i 30.3 se prezint modelul general al unui
sistem criptografic simetric era 128 de bii (algoritmii care au fost
acceptai finaliti pentru AES Advanced Encryption Standard), standard
cerut de NIST National Institute of Standards and Technology.
Algoritmul de criptare ctigtor la AES a fost cel care are schema
prezentat n figura 30.1. Algoritmul a fost creat scris pe 2 Octombrie 2000,
i a fost proiectat de Vincent Rijmen i Joan Rijndael. Aceasta este o
structur de date neconvenional.
Structura propriu-zis nu reine date, n schimb preia date din alte
structuri (fiier sau masiv de octei) i pune date n alte structuri.
Descrierea cifrului este relativ simpl dar nu face obiectul acestui capitol.

Aceast structur de date preia date sub form de octei (128 de bii) i
transmite criptai n funcie de cheie utilizator tot 128 de bii. n schema din
figura 30.1 este prezentat o singur rund, iar de exemplu pentru o cheie
de 128 bii i blocuri de criptare de 128 bii algoritmul se execut n 9
runde, adic figura 30.1 pus cap la cap de 9 ori.

Figura 30.1 Schema de criptare a algoritmului Rijndael AES


[Copyright Sava00]

Figura 30.2 Schema de criptare al algoritmului Twofish


[Copyright Twof00]
Algoritmul Twofish are 16 runde ce se bazeaz pe nite cutii S care
iau ca intrare 8 bii i produc 8 bii prin aplicarea unei funcii F bijective, n
timp ce Rijndael se bazeaz n cutiile S pe o transformare neliniar n
GF(28)).
Cifrul Twofish se mai bazeaz pe matrice 4x4 de distane maximum
separabile n cmp GF(28) MDS (n Rijndael se folosete ShiftRow
deplasare pe bii dup anumite reguli asupra blocului de informaii),
aplicarea de transformri pseudo-Hadamard (n Rijndael se folosete

MixColumn ca n figura 30.1, dar n implementare prin programare


nseamn multiplicare de matrice n GF(28)), i un mod de expandare al
cheilor la fel de eficient ca n Rijndael.

Figura 30.3 Schema cifrului RC6 Rivest Cipher 6 de la MIT


[Copyright Rive00]
Ideea principal este c i n sistemele criptografice se folosesc
structuri de date care sunt programate structuri ca atare sau ca simple
secvene de transformri. Nu este necesar ca sgeile din cifruri s fie
pointeri ctre funcii sau atribute. De fapt, ele reprezint fluxurile de date.
n practic se pot implementa structuri de liste circulare ce pstreaz
rezultatele intermediare din fiecare rund i le aplic altor blocuri de date
astfel nct descifrarea mesajului s fie imposibil.
Fiecare algoritm are propria schem de criptare i propriile operaii
algebrice.

Nu numai algoritmii de criptare se pot folosi n structuri de date dar i


funciile de dispersie (hash) pot crea avalane de modificri imposibil de
produs dac se aleg structuri de date complicate.
Aceste lucruri se fac pentru producerea unor avalane de modificri
greu de rezolvat fr cheia cifrului.

30.4 Structuri de date la nivelul de cifru al algoritmului


La nivelul modului de utilizare a algoritmilor simetrici se ntlnesc n
practic dou tipuri de cifrri: cifrarea bloc i cifrarea ir de caractere
(secvenial).
Cifrarea bloc opereaz cu blocuri de date n clar i cifrate de regul
64 i 128 bii dar, uneori, i mai mari.
Cifrarea secvenial opereaz cu secvene de date n clar i cifrate de
mrime un bit sau octet, dar, uneori i cu date de 32 de bii.
n cazul cifrrii bloc, acelai bloc de date n clar va fi cifrat de fiecare
dat n acelai bloc de date cifrat, folosind aceeai cheie. n cazul cifrrii
secveniale, secvene similare de date n clar vor fi cifrate diferit, n cazul
unor cifrri repetate.
Modurile de criptare constituie combinaii ale celor dou tipuri de
baz, unele folosind metode feedback, altele realiznd simple operaii.
Aceste operaii sunt simple deoarece securitatea este atributul cifrrii i nu
a modului n care se realizeaz schema de cifrare. Mai mult dect att,
modul de realizare a cifrrii nu duce la compromiterea securitii date de
algoritmul de baz.
Cifruri bloc
Cifrarea ECB (Electronic Codebook). ECB este cea mai obinuit cale
de cifrare bloc, prin care un bloc de date sau text clar se transform ntr-un
bloc cifrat. Din moment ce acelai bloc de date se cifreaz n acelai bloc
cifrat, teoretic este posibil crearea unei cri de coduri n care s se fac
asocierea date n clar date cifrate. ns, pentru blocuri de 64 de bii
rezult un numr de 264 intrri n cartea de coduri mrime prea mare
pentru a permite memorarea i manipularea datelor. n plus fiecare cheie
necesit propria carte de coduri.
Acesta este cel mai simplu mod de lucru, n care fiecare bloc de date
n clar este cifrat independent. Nu trebuie ca fiierul care se cripteaz s
intre n cifrare liniar, de la nceput pn la sfrit. Criptarea se face lund
aleator blocuri din cadrul fiierului. Acest lucru este important pentru
fiierele criptate care sunt accesate aleator, ca, de exemplu, n cazul bazelor
de date. Schema de lucru arat ca n figura 30.4.

Sistem
criptografic
simetric sau
asimetric

Fiiere sau
structuri de
date n clar

Fiiere sau
structuri de
date criptate

Figura 30.4 Structur de date pentru cifrarea ECB


Problema ECB-ului este c dac un criptanalist, care deine blocul de
date n clar i blocul de date cifrat echivalent pentru cteva mesaje, poate
realiza o carte de coduri fr a cunoate cheia. n exprimarea curent sunt
fragmente de mesaje care tind s se repete. Mesajele pot avea structuri
redundante sau iruri lungi de spaii sau zerouri. Dac criptanalistul
realizeaz c mesajul n clar 5ffa6ba1 se cripteaz n mesajul 778e342b,
el poate decripta imediat mesajul respectiv acolo unde l ntlnete.
Cifrarea bloc cu nlantuire CBC (Cipher Block Chaining) adaug
mecanismului de criptare un bloc cu reacie. Rezultatul criptrii unui bloc
anterior revine prin bucl i intervine n criptarea blocului curent. n felul
acesta, datele cifrate nu mai depind doar de datele n clar, ci i de modul de
cifrare a blocului anterior.
n CBC, datele n clar, nainte de a intra n blocul decriptare propriuzis, sunt nsumate modulo 2 (XOR) cu blocul de date cifrat anterior. Figura
30.5 reprezint modul de criptare CBC:
Registrul de reacie de 128
bii (iniializat aleator).
Bi

Ri
Bi XOR Ri

Bloc de date n
clar de 128 de
bii Bi

Fiiere sau
structuri de
date n clar

Sistem
criptografic
simetric sau
asimetric

i=i+1

Ri+1 =Ci

Se scrie Ci
Ci=Criptare(Bi XOR Ri)
Fiiere sau
structuri de
date criptate

Figura 30.5 Structura de date ce realizeaz criptarea CBC


Paii pe scurt sunt urmtorii:
se iniializeaz registrul de reacie cu o funcie hash de dispersie
MD5, care produce rezumatul unei parole;
pentru i de la 0 la numrul de blocuri a fiierului sau structurii de
date -1 se execut XOR ntre blocul citit din fiier i blocul de date
din registrul de reacie;
se scrie blocul criptat n fiier;
se atribuie registrului de reacie blocul de bii criptat;

se incrementeaz i i se reia procesul.


Aceasta e o structur de date compus care implic dou structuri de
date de tip fiier i o structur de tip masiv sau dup necesiti poate fi una
dinamic, list de liste de octei.
CBC face ca acelai bloc de date s se transforme n blocuri de date
diferite, deoarece la diferite rulri valoarea de iniializare a registrului de
reacie poate fi diferit. Dac valoarea iniial a registrului de reacie
rmne neschimbat ntre rulri, atunci dou mesaje identice folosind
aceeai cheie se vor transforma n acelai mesaj criptat.
Vectorul de iniializare, valoarea iniial a registrului de reacie, nu
trebuie neaprat s fie secret.
Chiar dac acest lucru pare greit, i anume de a nu ine secret
valoarea iniial, nu este deoarece, oricum prin canal circul blocurile
criptate dar nu i cheia. Deci, cineva care ar dori s sparg cifrul va trebui
s cunoasc ce structur de date s-a folosit i ce algoritm i mai mult s tie
protocolul de transmisie a datelor.
O posibil descriere n C/C++ a acestui tip de structur este:
struct CBC {
FILE *foriginal;
FILE *fcriptat;
unsigned char registruReactie[16];//16 octei = 128 bii
unsigned char buffer[16];
/*obiectul care realizeaza criptarea ce
AlgoritmCriptare ob;
primeste parametrii blocul de date in clar si parola si scoate
blocul criptat*/
};

O alt problem este c fiierele sau alte structuri de date nu se


mpart exact la 128 de bii, ceea ce nseamn c se completeaz cu 0
pn se ajunge la lungimea dorit multiplu de 128 de bii.
Cifarea CBC cu propagare (PCBC Propagation Cipher Block
Chaining) este similar cu CBC, cu excepia faptului c att blocul de date
anterior n clar, ct i cel cifrat anterior sunt fcute XOR cu blocul curent de
date n clar nainte sau dup criptare ca n figura 30.6.
PCBC a fost utilizat n Kerberos versiunea 4 pentru a realiza n acelai
timp secretizarea ct i testul de integritate. O eroare n blocul de date
cifrat, va determina decriptarea incorect a tuturor blocurilor urmtoare.
Aceasta nseamn c este necesar transmiterea n finalul mesajului a unui
bloc standard pentru a se asigura integritatea mesajului.

Registrul de reacie de 128


bii (iniializat aleator).
Ri-1
B=Bi XOR Bi-1

B XOR Ri-1

Bi-1
Bi

Fiiere sau
structuri de
date n clar

Sistem
criptografic
simetric sau
asimetric

i=i+1
Ri=Ci-1

Ci-1 = Criptare(b XOR Ri-1 )


Fiiere sau
structuri de
date criptate

Figura 30.6 Structur de date care realizeaz PCBC


Paii algoritmului ct i iniializrile sunt cele de la CBC. n continuare
se va prezenta codul surs n C++ pentru codificarea acestei structuri.
Descriere n totalitate a claselor AlgoritmCriptare i FunctieHash nu face
obiectul acestui capitol, iar completarea fiierului cu lungimea multiplu de
128 de bii nu este prezentat.
#include <stdio.h>
#include <string.h>
#include <io.h>
class AlgoritmCriptare {
private:
char *tipulAlg;
char *parola;
int
lungCheie;
char *tipHashGenerareParola;
public:
AlgoritmCriptare(char*,char*,int,char*);
~AlgoritmCriptare();
unsigned char* doFinalEncryption(unsigned char*);
unsigned char* doFinalDecryption(unsigned char*);
};
AlgoritmCriptare::AlgoritmCriptare(char* tipAlg,char* pass,int lCheie,
char* tipHash4Pass) {
strcpy(this->tipulAlg,tipAlg);
strcpy(this->parola,pass);
this->lungCheie = lCheie;
strcpy(this->tipHashGenerareParola,tipHash4Pass);
}
AlgoritmCriptare::~AlgoritmCriptare() {
strcpy(this->tipulAlg,"0");
strcpy(this->parola,"0");
this->lungCheie = 0;
strcpy(this->tipHashGenerareParola,"0");

}
unsigned char* AlgoritmCriptare::doFinalEncryption(unsigned char
*message4Encryption) {
if(stricmp(this->tipulAlg,"Rijndael")==0) {
//se fac pasii algoritmului Rijndael sau al altui algoritm
//la sfarsit se intoarce rezultatul care este in
//principiu de 128 de biti
//criptare
unsigned char* rezultat = NULL;
for(int i=0;i<128;i++)rezultat[i] = message4Encryption[i];
//criptarea in functie de parola data
return (unsigned char*)rezultat;
}
else return NULL;

}
unsigned char* AlgoritmCriptare::doFinalDecryption(unsigned char
*message4Decryption) {
if(stricmp(this->tipulAlg,"Rijndael")==0) {
//se fac pasii algoritmului Rijndael sau al altui algoritm
//la sfarsit se intoarce rezultatul care este in principiu
//de 128 de biti
//decriptare
unsigned char* rezultat = NULL;
for(int i=0;i<128;i++)rezultat[i] = message4Decryption[i];
//decriptarea in functie de parola data
return (unsigned char*)rezultat;
}
else return NULL;

}
class FunctieHash {
private:
char *numeFctHash;
unsigned char *mesajDeDigerat;
int lmesaj;
public:
FunctieHash(char*);
~FunctieHash();
unsigned char * doFinalHash(unsigned char*);
int lungime(unsigned char*);
};
FunctieHash::FunctieHash(char *nameFctHash) {
strcpy(this->numeFctHash,nameFctHash);
}
FunctieHash::~FunctieHash() {
strcpy(this->numeFctHash,"0");
for(int i=0;i<this->lmesaj;i++)
this->mesajDeDigerat[i]='0';
this->mesajDeDigerat = NULL;
}
int FunctieHash::lungime(unsigned char* cc) {
int i=0;
for(;((cc[i]!='\0')|(cc[i]!=NULL));i++);
this->lmesaj = i;
return i;
}
unsigned
char
*
FunctieHash::doFinalHash(unsigned
char*
message4Digest) {
if(stricmp(this->numeFctHash,"MD5")==0) {
this->mesajDeDigerat = message4Digest;
this->lungime(this->mesajDeDigerat);

unsigned char* rezultat=NULL;


for(int
i=0;i<this->lmesaj;i++)rezultat[i]
message4Digest[i];
//se executa hashul
return rezultat;
}
else return NULL;
}
class PCBC {
private:
FILE *fo;
FILE *fc;
unsigned char* registruReactie;
//de obicei are 16 octei = 128 bii
unsigned char *buffer[2];
AlgoritmCriptare *obac;// obiectul care realizeaza criptarea
// ce primeste parametrii blocul de date
// in clar si parola si scoate blocul
// criptat
FunctieHash *obfh;
// obiect ce realizeaza functia de
// dispersie si
// initializeaza registrul de reactie
char *nfo;
char *nfc;
public:

PCBC(char *nume_fis_orig,char *nume_fis_criptat,


nameAlg,
char* passKeyAlg, int lenKey, char* nameHashF, unsigned
passregReact);
~PCBC();

char*
char*

void doFinalPCBCEncryption();
};
PCBC::PCBC(char *nume_fis_orig,char *nume_fis_criptat, char* nameAlg,
char* passKeyAlg, int lenKey, char* nameHashF, unsigned char*
passRegReact) {
strcpy(this->nfo, nume_fis_orig);
strcpy(this->nfc, nume_fis_criptat);
this->fo = fopen(this->nfo,"rb");
this->fc = fopen(this->nfo,"wb+");
this->obac
=
new
AlgoritmCriptare(nameAlg,passKeyAlg,lenKey,nameHashF);
this->obfh = new FunctieHash(nameHashF);
this->registruReactie = this->obfh->doFinalHash(passRegReact);
}
void PCBC::doFinalPCBCEncryption() {
unsigned char buff[16];
unsigned char * rez;
//inainte de a apela metoda se face "umplerea fisierului cu "0"
//pana cand lungimea lui este divizibila cu 2*128 biti
int j=0;
while(!feof(this->fo)) {
if(!feof(this->fo)){
fread(this->buffer[1],sizeof(unsigned char[16]),1,this->fo);
}
if(!feof(this->fo)){
fread(this->buffer[2],sizeof(unsigned char[16]),1,this->fo);
}
long ll = ftell(this->fo);

fseek(this->fo,ll-sizeof(unsigned char[16]),SEEK_SET);
for(j=0;j<16;j++)
buff[j] = this->buffer[1][j] ^ this>buffer[2][j];
for(j=0;j<16;j++)
buff[j] = buff[j] ^ this->registruReactie[j];
rez = this->obac->doFinalEncryption(buff);
fwrite(&rez,sizeof(char[16]),1,this->fc);
this->registruReactie = rez;
}
}
PCBC::~PCBC() {
if(this->fo!=NULL)
if(this->fc!=NULL)
}

fclose(fo);
fclose(fc);

Decriptarea PCBC se face la fel ca i criptarea. Acest mod de


criptare/decriptare se poate folosi cu orice tip de algoritm ce fundamenteaz
un sistem criptografic simetric.
Cifruri secveniale
Prin Cifrarea secvenial (Stream Ciphers) datele n clar se convertesc
bit cu bit n text cifrat. Modelul general, structura de date care
fundamenteaz modelul, este dat n figura 30.7.

Generator de
chei

Ki

Pi date n clar
Fiiere

Generator de
chei

Date cifrate
Ci

Ki

Date n clar
Fiiere

Figura 30.7 Structur de date pentru cifrare secvenial


Exist un generator de cheie care, n funcie de timp i, uneori parol,
genereaz un ir de bii k1, k2, , ki. Cu acest ir cheie se face XOR cu irul
de bii ai blocului de date n clar, p1, p2, , pi, pentru a produce un ir de
date cifrate: ci =pi ki.
La sfritul decriptrii, rezultatul este obinut din efectuarea unui XOR
ntre criptogram i aceeai cheie curent.
Securitatea sistemului depinde n ntregime de generatorul de chei
din aceast structur de date. Dac aceast cheie genereaz acelai ir
cheie, atunci securitatea sistemului nu este deosebit. Dac, ns, acesta
genereaz iruri aleatoare, atunci exist un nalt grad de securitate.

Acest tip este cel mai simplu mod de cifrare secvenial. Mai exist
cifrarea secvenial cu auto-sincronizare, cifrarea cu reacie, cifrarea
secvenial sincron i cifrarea secvenial cu reacie la ieire. Aceste tipuri
de cifrri au tipuri proprii de structuri de date cu ajutorul crora se
realizeaz criptarea/decriptarea blocurilor de date.

30.5 Structuri de date la nivelul protocoalelor


transmisie a datelor i al memorrii certificatelor publice

de

Algoritmul dominant n sistemele oferite pe piaa de software pentru


sistemele de semntur electronic l reprezint algoritmul RSA (Rivest
Shamir Adleman), considerat un standard de facto n acest domeniu. RSA
i bazeaz tria criptografic pe imposibilitatea factorizrii numerelor
ntregi foarte mari. Folosirea acestui algoritm n industrie se face conform
unei suite de standarde, cunoscute sub denumirea de PKCS (Public-Key
Cryptography Standards), realizate de proprietarul lui RSA, firma RSA Data
Security Inc.s: PKCS #3 descrie metoda Diffie-Hellman de distribuire a
cheilor criptografice simetrice:
PKCS #1 descrie metoda matematic de cifrare i descifrare
RSA, precum i implementarea lor pentru realizarea dou funcii:
semnarea electronic i anveloparea digital a cheilor
criptografice simetrice (PKCS #1 include acum i PKCS #2 i
PKCS #4);
PKCS #3 descrie metoda Diffie-Hellman de distribuire a cheilor
criptografice simetrice;
PKCS #5 descrie metoda de implementare a cifrrii simetrice
DES-CBC, cu o cheie derivat din parol;
PKCS #6 descrie standardul de certificat digital, supra-set al
standardului X.509;
PKCS #7 descrie sintaxa general a datelor ce urmeaz a fi
criptate sau semnate;
PKCS #8 descrie sintaxa perechii private a cheilor RSA (cheie i
atribute);
PKCS #9 descrie atributele tipurilor definite n #6,#7,#8;
PKCS #10 descrie sintaxa standard pentru cererile de certificat;
PKCS #11 descrie interfaa de program numit Cryptoki;
PKCS #12 descrie sintaxa pentru memorarea n cadrul
software-ului a
unor informaii criptografice, cum ar fi chei
publice,
chei
secrete,
certificate.
Scopul
l
constituie
standardizarea unei structuri de fiier ce poate fi folosit de mai
multe aplicaii.
Forma electronic complet a acestor standarde se gsete la adresa:
http://www.rsa.com/rsalabs/pubs/PKCS/ sau se poate obine prin e-mail de
la adresa: pkcs@rsa.com . n ceea ce privete protocoalele implementate de
diferite aplicaii se ntlnesc structuri de date foarte diferite. De exemplu, n
aplicaia SSFTP descris n [Ivan02] chiar dac se folosete un protocol de
tip text n momentul de transmitere a cheilor publice se scriu n reea
obiecte serializate n format de certificat digital standard X509 descris n
PKCS #6.
PKCS #6 versiunea 1.5 descrie sintaxa certificatelor extinse. Un
certificat extins este format din certificatul unei chei publice, aa cum este

el descris n standardul X509 i un set de atribute; acest certificat extins


este semnat de cel care l emite. De aceea, autenticitatea certificatului
poate fi verificat printr-o singur operaie cu cheia public i oricnd poate
fi extras certificatul de tip X509.
Sintaxa certificatului extins n ASN1 este urmtoarea:
ExtendedCertificate::=SEQUENCE{
extendedCertificateInfo ExtendedCertificateInfo,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature Signature
}
SignatureAlgorithmIdentifier::=AlgorithmIdentifier
Signature::=BIT STRING
ExtendedCertificateInfo::=SEQUENCE{
version Version,
certificate Certificate,
attributes Attributes
}
Version::=INTEGER
Attributes::=SET OF Attribute

Se observ c acestea sunt structuri n alte structuri de date i sunt


create pentru a asigura un standard i o calitate superioar a aplicaiilor
informatice. Toate PKCS-urile conin structuri n structuri de date i sunt
unanim acceptate n industria criptografic de ctre productori.
n orice tip de aplicaie, dar mai ales n cele n care este necesar
asigurarea unei protecii superioare a informaiilor, se folosesc structuri de
date mai mult sau mai puin convenionale.
Structurile de date uureaz n general munca de programare.
Structurile de date care se implementeaz nu in de limbajul de
programare; se pot implementa n orice limbaj de programare universal:
Pascal, C/C++, C#, Java. n criptografie se folosesc cu predilecie astfel de
structuri la toate nivelurile procesului implementat: de la nivelul aplicaie al
algoritmului pn la protocolul de transmisie n reea. Structurile alese in
de natura aplicaiei i se o serie de cauze subiective (alegerea
programatorului) i obiective (restriciile impuse de aplicaie). Structurile de
date mai sunt folosite i n securitatea criptrii simetrice pentru protecia
cheii. Managementul cheilor este vital n securitatea datelor i cuprinde
urmtoarele aspecte:
generarea cheilor se folosesc tabele de conversie i structuri de
date ce implementeaz funcii de dispersie;
distribuia cheilor transportul cheii secrete;
memorarea cheilor.
Nu exist domeniu al informaticii aplicate, i cu att mai mult n
securizarea datelor, n care s nu se foloseasc structuri de date.

S-ar putea să vă placă și