Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator nr. 1
Disciplina Securitatea informațională
Tema Algoritmul de criptare simetrici
A efectuat, st. gr. TI-132 Zubcov Olga
Chișinău 2016
Scopul lucrării
În aceasta lucrare de laborator se vor studia si analiza metodologii si algoritmi
de criptare.
Sarcina lucrării
De studiat si de implementat algoritmul de criptare DES.
Noțiuni teoretice
Generarea cheii
Se alege q, astfel incât el este prim si are o dimensiune de 160 de biti (2159 < q < 2160)
Se alege p, astfel incât el este prim si p = 2qz+1 (2512< p < 21024)
Ultimele reglementari specifica faptul ca p ar trebui sa fie pe fix 1024 de biti, ceea ce inseamna
ca z trebuie sa fie pe 864 de biti.
Se alege h ∈ Zp*, unde h este o radacina primitiva in Zp*.
α = hz’ mod p, unde z’ = (p-1)/q .
Se alege arbitrar α ∈ Zp*.
Se calculeaza β = αa mod p.
Cheia publica este (p, q, α, β).
Cheia privata este a.
Semnarea
Se alege arbitrar k ∈ Zq*.
Se calculeaza x=SHA-1(mesaj), cu x pe 160 de biti; SHA-1 este functia de hash, care realizeaza
rezumatul mesajului (returneaza un numar in functie de continutul mesajului).
Se calculeaza γ = ( αk mod p).
Se calculeaza δ = ( k-1(x + aγ)) mod q.
Daca vreuna dintre cele doua valori (γ sau δ) este egala cu zero, atunci se reia calculul cu generarea unui
alt k.
Cheia de semnare este (γ, δ).
Verificarea
Se calculeaza w = δ-1 mod q.
Se calculeaza e1 = (xw) mod q.
Se calculeaza e2 = (γw) mod q.
Se calculeaza v = ((αe1βe2) mod p) mod q.
Semnatura este valida daca si numai daca v = γ.
Algoritmul Semnaturii Digitale este similar Schemei de semnatura ElGamal.
Corectitudine
Algoritmul este corect in sensul ca destinatarul va accepta intotdeauna doar semnaturi originale. Acest
lucru poate fi demonstrat dupa cum urmeaza:
Din α = hz’ mod p rezulta αq ≡ hqz’ ≡ hp-1 ≡ 1 (mod p) din Teorema lui Fermat. Deoarece α > 1 si q este
prim, α are ordinul q.
Expeditorul calculeaza
δ = (k-1 (x + α γ))
Deci
k ≡ xδ-1 + a γδ – 1k ≡ xw + aγw
Deoarece α are ordinul q
αk ≡ αxwαaγwαk ≡ αxwβγwαk ≡ αe1βe2 (mod p).
in sfârsit, corectitudinea algoritmului vine din
Securitate
Acest algoritm este considerat imposibil de spart, datorita siguranței mari asigurate de câteva puncte, cum
ar fi generarea aleatoare a lui p, q, a si k. Pentru a se afla k, de exemplu, ar trebui rezolvata o problema de
tipul logaritmilor discreți, care este o problema “dificila”, in sensul ca ajungerea la o soluție poate dura
câteva luni.
Executarea lucrării
import java.util.Scanner;
class DES_1 {
// Initial Permutation table
private static final byte[] IP = {
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
// Array to store the number of rotations that are to be done on each round
private static final byte[] rotations = {
1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};
// Permutation table
private static final byte[] P = {
16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25
};
// Java does not add padding zeros, i.e. 5 is returned as 111 but
// we require 0111. Hence, this while loop adds padding 0's to the
// binary value.
while(s.length() < 4) {
s = "0" + s;
}
// Add the 4 bits we have extracted into the array of bits.
for(int j=0 ; j < 4 ; j++) {
inputBits[(4*i)+j] = Integer.parseInt(s.charAt(j) + "");
}
}
// After PC1 the first L and R are ready to be used and hence looping
// can start once L and R are initialized
System.arraycopy(newBits, 0, L, 0, 32);
System.arraycopy(newBits, 32, R, 0, 32);
System.out.print("\nL0 = ");
displayBits(L);
System.out.print("R0 = ");
displayBits(R);
for(int n=0 ; n < 16 ; n++) {
System.out.println("\n-------------");
System.out.println("Round " + (n+1) + ":");
// newR is the new R half generated by the Fiestel function. If it
// is encrpytion then the KS method is called to generate the
// subkey otherwise the stored subkeys are used in reverse order
// for decryption.
int newR[] = new int[0];
if(isDecrypt) {
newR = fiestel(R, subkey[15-n]);
System.out.print("Round key = ");
displayBits(subkey[15-n]);
} else {
newR = fiestel(R, KS(n, keyBits));
System.out.print("Round key = ");
displayBits(subkey[n]);
}
// xor-ing the L and new R gives the new L value. new L is stored
// in R and new R is stored in L, thus exchanging R and L for the
// next round.
int newL[] = xor(L, newR);
L = R;
R = newL;
System.out.print("L = ");
displayBits(L);
System.out.print("R = ");
displayBits(R);
}
// R and L has the two halves of the output before applying the final
// permutation. This is called the "Preoutput".
int output[] = new int[64];
System.arraycopy(R, 0, output, 0, 32);
System.arraycopy(L, 0, output, 32, 32);
int finalOutput[] = new int[64];
// Applying FP table to the preoutput, we get the final output:
// Encryption => final output is ciphertext
// Decryption => final output is plaintext
for(i=0 ; i < 64 ; i++) {
finalOutput[i] = output[FP[i]-1];
}
} else {
System.out.print("Encrypted text: ");
}
System.out.println(hex.toUpperCase());
return finalOutput;
}
Algoritmul DES are o varianta mai simplificată DES Simplificat care este o
variantă mai simplă utilizată pentru studiu.