UNIVERSITÀ DI CATANIA
DIPARTIMENTO DI MATEMATICA E INFORMATICA
CORSO DI LAUREA IN INFORMATICA, SECONDO LIVELLO
Progetto di Sicurezza
Implementazione di una demo che permetta di
eseguire crittografia con diversi algoritmi
Oreste Delitala W82000025 Anno 2013/2014
JCA e JCE
2
Linguaggio Java
Java
Cryptography Architecture (JCA)
Java
Cryptography Extension (JCE)
Oreste Delitala W82000025 Anno 2013/2014
Java Cryptography Architecture (JCA)
3
MessageDigest
Signature
KeyPairGeneration
KeyFactory
CertificateFactory
KeyStore
AlgorithmParameters
AlgorithmParameterGenerator
SecureRandom
Oreste Delitala W82000025 Anno 2013/2014
Architettura JCA
4
Factory pattern
getIstance()
MessageDigest
Engine
(abstract)
MessageDigestSPI
SPI
(abstract)
Strategy pattern
CSP1MD5
CSP2MD5 CSP2SHA1
Providers
Oreste Delitala W82000025 Anno 2013/2014
Provider
5
Un provider è un insieme di implementazioni di vari
algoritmi
SUN
MD5, SHA-1
DSA
Creazioni di certificati X.509
Generazione di numeri random proprietaria
Keystore proprietario
Oreste Delitala W82000025 Anno 2013/2014
Java Crtptography Extension JCE
6
ha la stessa architettura di JCA
È costituita da javax.crypto e sotto-package
Classi principali
Cipher
KeyAgreement
Mac
SecretKey
SecretKeyFactor
Oreste Delitala W82000025 Anno 2013/2014
Principali Provider per JCE
7
Bouncy Castke
Open
Source
Provider più completo
SunJCE
Open
Source
Non compatibile con altri Provider
Non supporta RSA
Oreste Delitala W82000025 Anno 2013/2014
Cifratura Simmetrica
8
Principali classi ed interfacce
Javax.crypto.Cipher
getInstance, init, update, doFinal
Java.security.Key(interfaccia)
Creato da:
Javax.crypto.KeyGenerator
Java.security.KeyFactory
Javax.crypto.KeyGenerator
getInstance, init, generateKey
Oreste Delitala W82000025 Anno 2013/2014
La classe Cipher
9
getInstance(“algorithm/mode/padding”, “provider”)
Algorithm
DES
DESede
AES
Mode
CBC
ECB
Padding
PKCS5Padding
NoPadding
Oreste Delitala W82000025 Anno 2013/2014
La classe Cipher
10
init(mode, key)
Cipher.ENCRYPT_MODE
Cipher.DECRYPT_MODE
update(bytes)
doFinal(bytes)
Oreste Delitala W82000025 Anno 2013/2014
Modalità ECB
11
Oreste Delitala W82000025 Anno 2013/2014
Modalità CBC
12
Oreste Delitala W82000025 Anno 2013/2014
I passi della cifratura ECB
13
Creazione di una chiave
1.
2.
3.
KeyGenerator keyGenerator = KeyGenerator.getIstance(“DES”);
keyGenerator.init(64);
SecretKey key = keyGenerator.generateKey();
Creazione ed inizializzazione di un cifrario
1.
Chiper cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”);
Oreste Delitala W82000025 Anno 2013/2014
I passi della cifratura ECB
14
Cifratura
1.
2.
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(stringToEncrypt.getBytes());
Decifratura
1.
2.
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText = cipher.doFinal(cipherText);
Oreste Delitala W82000025 Anno 2013/2014
I passi della cifratura CBC
15
Creazione di una chiave
1.
2.
KeyGenerator keyGenerator = KeyGenerator.getInstance(“DES”);
SecretKey key = keyGenerator.generateKey();
Creazione ed inizializzazione di un cifrario
1.
2.
3.
4.
5.
6.
7.
byte[] randomBytes = new byte[8]; //iv size = block size
SecureRandom random = new SecureRandom();
random.nextBytes(randomBytes);
IvParameterSpec ivparams = new IvParameterSpec(randomBytes);
Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”);
Cipher.init(Cipher.ENCRYPT_MODE, key, ivparams); // cifratura
Cipher.init(Cipher.DECRYPT_MODE, key, ivparams); // decifratura
Oreste Delitala W82000025 Anno 2013/2014
Generare una chiave da una Stringa
16
1.
2.
3.
4.
5.
String password = “password”;
byte[] desKeyData = password.getBytes();
DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(desKeySpec);
Oreste Delitala W82000025 Anno 2013/2014
Sicurezza Cifratura Simmetrica
17
ECB
CBC
Proteggere l’IV
DES
Vulnerabile alla critto analisi
Chiave a 64 bit vulnerabile all’attacco del compleanno
DESede
Chiave sicura a 192 bit
Blocchi da 64 bit troppo piccoli
AES
Sicuro perché usa chiave e blocco di lunghezza 128 bit
Oreste Delitala W82000025 Anno 2013/2014
Cifratura Asimmetrica
18
Generalmente usata per cifrare dati di “piccole”
dimensioni (in bit)
Per “grandi” dimensioni si utilizza la cifratura
asimmetrica a chiave di sessione
( e, d) un public-private key pair
P un “grande” payload
K
newSimmetricKey()
M
= [ Ek(P), Ee(K) ]
Oreste Delitala W82000025 Anno 2013/2014
Cifratura Asimmetrica
19
Principali classi ed interfacce
java.security.KeyPair
getPublic(), getPrivate()
java.security.PublicKey(interfaccia)
javax.crypto.PrivateKey(interfaccia)
Java.security.KeyPairGenerator
genKeyPair()
Oreste Delitala W82000025 Anno 2013/2014
La classe Cipher
20
getInstance(“algorithm/mode/padding”, provider)
Algorithm
RSA
Mode
ECB
Padding
NoPadding
PKCS1Padding
OAEPWithSHA-1AndMGF1Padding
OAEPWithSHA-256AndMGF1Padding
Oreste Delitala W82000025 Anno 2013/2014
La classe Cipher
21
init(mode, key)
Cipher.ENCRYPT_MODE
publicKey
Cipher.DECRYPT_MODE
privateKey
update(bytes)
doFinal(bytes)
Oreste Delitala W82000025 Anno 2013/2014
OAEP
22
Oreste Delitala W82000025 Anno 2013/2014
I passi della cifratura
23
Creazione di una chiave
1.
2.
3.
4.
5.
KeyPairGenerator generator = KeyPairGenerator.getIstance(“RSA”);
keyGenerator.init(1024);
KeyPair pair = generator.generateKeyPair();
Key pubKey = pair.getPublic();
Key privKey = pair.getPrivate();
Creazione ed inizializzazione di un cifrario
1.
Chiper cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”);
Oreste Delitala W82000025 Anno 2013/2014
I passi della cifratura
24
Cifratura
1.
2.
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(stringToEncrypt.getBytes());
Decifratura
1.
2.
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher.doFinal(cipherText);
Oreste Delitala W82000025 Anno 2013/2014
Codifica e decodifica di chiavi (RSA)
25
Codifica:
Chiave
pubblica: X.509
Chiave privata: PKCS#8
Oreste Delitala W82000025 Anno 2013/2014
Codifica e decodifica di chiavi (RSA)
26
Decodifica
Public key
1.
2.
3.
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec publicKeySpec = new
X509EncodedKeySpec(keyBytes);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Private key
1.
2.
3.
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec privateKeySpec = new
PKCS8EncodedKeySpec(keyBytes);
PrivateKey privateKey =
keyFactory.generatePrivate(privateKeySpec);
Oreste Delitala W82000025 Anno 2013/2014
Sicurezza Crittografia Asimmetrica
27
Problema della Fattorizzazione
Oreste Delitala W82000025 Anno 2013/2014
HMAC
28
Oreste Delitala W82000025 Anno 2013/2014
HMAC
29
Classe
Javax.crypto.Mac
getInstance(“algorithm”,
“provider”)
Algorithm
HmacSHA1
HmacSHA256
init(key)
update(bytes)
doFinal()
Oreste Delitala W82000025 Anno 2013/2014
I passi di cifratura
30
Generazione di una chiave
Creazione di un oggetto MAC
Mac mac = Mac.getInstance(“HmacSHA1”);
Inizializzazione del MAC
KeyGenerator keygen = KeyGenerator.getInstance("HmacSHA1");
Key macKey = keygen.generateKey();
mac.init(macKey);
Restituzione del MAC
mac.update(text.getByte())
byte[] result = mac.doFinal();
Oreste Delitala W82000025 Anno 2013/2014
I passi di cifratura
31
Verifica del MAC
si
prende in input (message, mac)
si calcola il mac di message con la chiave segreta
si confrontano i 2 mac se sono uguali
Oreste Delitala W82000025 Anno 2013/2014
Sicurezza HMAC
32
Attacchi Replay
Soluzione
Cifrare il Digest
Simmetrica
CBC
Asimmetrica
Valore
segreto SAB condiviso
HMAC(SAB||M)
Non si ha sicurezza su chi ha eseguito l’HMAC tra
mittente e ricevente
Oreste Delitala W82000025 Anno 2013/2014
Firma Digitale
33
Classe principale
java.security.Signature
getInstance(“algorithm”,”provider”)
Algorithm
SHA1withDSA
initSign(privKey),
initVerify(pubKey)
update(bytes)
sign()
verify(sign)
Oreste Delitala W82000025 Anno 2013/2014
I passi di cifratura
34
Generazione di una coppia di chiavi
1.
2.
3.
4.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA",
"SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG",
"SUN");
keyGen.initialize(1024, random);
KeyPair keyPair = keyGen.generateKeyPair();
Generazione di un Signature engine
1.
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
Oreste Delitala W82000025 Anno 2013/2014
I passi di cifratura
35
Generazione della firma digitale
1.
2.
3.
sig.initSign(privKey);
sig.update(data);
byte[] signBytes = sig.sign();
Verifica della firma digitale
1.
2.
3.
4.
5.
6.
7.
sig.initVerify(pubKey);
sig.update(data);
try{
verified = sig.verify(signBytes);
} catch(SignatureException e){
verified = false;
}
Oreste Delitala W82000025 Anno 2013/2014
Sicurezza Firma Digitale
36
Non repudiabilità
Oreste Delitala W82000025 Anno 2013/2014