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