Wednesday, January 25, 2006
Ex: criptare fisier sau sir cu AES128, CBC, PKCS5Padding
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
public class AES {
private byte functiune;
private Cipher cifrul;
SecretKey cheia;
byte[] IVul;
public AES(byte ceFunctiune , byte[] pCheia , byte[] PIVul) throws Exception{
functiune =ceFunctiune;
switch(functiune) {
case 'C': initCriptare();
break;
case 'D': initDecriptare( pCheia , PIVul );
break;
default: throw new Exception("apel gresit constructor AES");
}
}
private void initCriptare(){
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
cheia = kgen.generateKey();
//SecretKeyFactory fabrica = SecretKeyFactory.getInstance("AES");
cifrul = Cipher.getInstance("AES/CBC/PKCS5Padding");
cifrul.init(Cipher.ENCRYPT_MODE, cheia);
IVul = cifrul.getIV();
} catch ( NoSuchAlgorithmException e) {
System.out.println( "exceptie algoritm AES" );
} catch ( NoSuchPaddingException e ) {
System.out.println( "exceptie aliniere AES" );
} catch( InvalidKeyException e) {
System.out.println( "exceptie cheie AES" );
}
}
private void initDecriptare( byte[] pCheia , byte[] PIVul){
try {
cheia = new SecretKeySpec(pCheia, "AES");
IVul = PIVul.clone();
cifrul = Cipher.getInstance("AES/CBC/PKCS5Padding");
cifrul.init(Cipher.DECRYPT_MODE, cheia , new IvParameterSpec(IVul) );
} catch ( NoSuchAlgorithmException e) {
System.out.println( "exceptie algoritm AES" );
} catch ( NoSuchPaddingException e ) {
System.out.println( "exceptie aliniere AES" );
} catch( InvalidKeyException e) {
System.out.println( "exceptie cheie AES" );
} catch( InvalidAlgorithmParameterException e) {
System.out.println( "exceptie vector initializare AES" );
}
}
public byte[] getSpecificatiaCheii() {
return cheia.getEncoded();
}
public byte[] getIV() {
return IVul.clone();
}
public static String asHex (byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10)
strbuf.append("0");
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
public String actioneaza(byte pTip , String sursa , String destinatie) throws Exception {
String result = null;
switch(pTip) {
case 'F': switch(functiune) {
case 'C': try {
FileInputStream fin = new FileInputStream(sursa);
FileOutputStream fout = new FileOutputStream(destinatie);
encryptStream(fin, fout);
result = new String("criptat fisierul "+sursa+" in fisierul"+destinatie);
} catch (FileNotFoundException e) {
System.out.println("fisere negasite la criptare AES");
};
break;
case 'D': try {
FileInputStream fin = new FileInputStream(sursa);
FileOutputStream fout = new FileOutputStream(destinatie);
decryptStream(fin, fout);
result = new String("decriptat fisierul "+sursa+" in fisierul"+destinatie);
} catch (FileNotFoundException e) {
System.out.println("fisere negasite la decriptare AES");
};
break;
};
break;
case 'S': switch(functiune) {
case 'C': result = encryptString(sursa);
result = new String("criptat sirul "+sursa+" cu reprezentarea "+
asHex(sursa.getBytes())+" in sirul cu reprezentarea "+
asHex(result.getBytes()));
break;
case 'D': result = decryptString(sursa);
result = new String("decriptat sirul cu reprezentarea "+
asHex(sursa.getBytes())+" in sirul"+result+
"cu reprezentarea "+
asHex(result.getBytes()));
break;
}
break;
default: throw new Exception("apel gresit actioneaza AES");
}
return result;
}
// metoda criptare String
private String encryptString(String sursa) {
String result = null;
try {
// Encode the string into bytes using utf-8
byte[] utf8 = sursa.getBytes("UTF8");
// Encrypt
byte[] enc = cifrul.doFinal(utf8);
// Encode bytes to base64 to get a string
return new sun.misc.BASE64Encoder().encode(enc);
} catch (javax.crypto.BadPaddingException e) {
System.out.println("eroare aliniere la criptare sir AES");
} catch (IllegalBlockSizeException e) {
System.out.println("eroare dimenisune bloc la criptare sir AES");
} catch (UnsupportedEncodingException e) {
System.out.println("eroare codificare la criptare sir AES");
} catch (java.io.IOException e) {
System.out.println("eroare IO la criptare sir AES");
}
return result;
}
// metoda decriptare String
private String decryptString(String sursa) {
String result = null;
try {
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(sursa);
byte[] utf8 = cifrul.doFinal(dec);
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingException e) {
System.out.println("eroare aliniere la decriptare sir AES");
} catch (IllegalBlockSizeException e) {
System.out.println("eroare dimenisune bloc la decriptare sir AES");
} catch (UnsupportedEncodingException e) {
System.out.println("eroare codificare la decriptare sir AES");
} catch (java.io.IOException e) {
System.out.println("eroare IO la decriptare sir AES");
}
return result;
}
// metoda criptare Stream
private void encryptStream(InputStream in, OutputStream out) {
byte[] buf = new byte[1024];
try {
out = new CipherOutputStream(out, cifrul);
int numRead = 0;
while ((numRead = in.read(buf)) >= 0) {
out.write(buf, 0, numRead);
}
out.close();
} catch (java.io.IOException e) {
}
}
// metoda decriptare Stream
private void decryptStream(InputStream in, OutputStream out) {
byte[] buf = new byte[1024];
try {
in = new CipherInputStream(in, cifrul);
int numRead = 0;
while ((numRead = in.read(buf)) >= 0) {
out.write(buf, 0, numRead);
}
out.close();
} catch (java.io.IOException e) {
}
}
}
public class TestAES{
public static void main(String[] args){
if (args.length == 2) {
try{
AES criptor = new AES((byte)'C', new String("").getBytes() , new String("").getBytes());
System.out.println("Cheia utilizata: "+AES.asHex(criptor.getSpecificatiaCheii()));
System.out.println("Vectorul de initializare: "+AES.asHex(criptor.getIV()));
System.out.println( criptor.actioneaza((byte)'F' , args[0] , args[1]) );
System.out.println( criptor.actioneaza((byte)'S' , args[0] , new String("")) );
byte[] spec = criptor.getSpecificatiaCheii();
byte[] iv = criptor.getIV();
AES decriptor = new AES((byte)'D', spec , iv);
String numeFisNou = new String(args[0]+"copie");
System.out.println( decriptor.actioneaza((byte)'F' , args[1] , numeFisNou) );
} catch(Exception e) {
System.out.println(e.toString());
}
} else {
System.out.println("apelul este de forma: TestAES fisierIntrare fisierIesire");
}
}
}
Ex: listarea serviciilor
- codul sursa
import java.util.*;
import java.security.*;
import javax.crypto.*;
import java.io.*;
public class ListareServicii{
// metoda ce returneaza serviciile pentru toti furnizorii de servicii de criptografie instalati
// sub forma unui array de String-uri
public static String[] getServiceTypes() {
Set result = new HashSet();
Provider[] providers = Security.getProviders();
// si pentru fiecare
for (int i=0; i<providers.length; i++) {
// construiesc lista cu descrierile native ale serviciilor
Setserviciile = providers[i].getServices();
for ( Iterator it=serviciile.iterator(); it.hasNext(); ) {
Provider.Service serviciul = (Provider.Service)it.next();
result.add(serviciul.toString());
}
}
return (String[])result.toArray(new String[result.size()]);
}
// main-ul
public static void main(String[] argumente) {
// afisare servicii si implementarile lor
ListareServicii testul = new ListareServicii();
String[] serviciile = testul.getServiceTypes();
for (int i=0; i<serviciile.length; i++) {
System.out.println("Serviciul este: "+serviciile[i]);
}
}
} - exemplu rulare
- Serviciul este: SunJCE: Cipher.PBEWithSHA1AndRC2_40 -> com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndRC2_40 aliases: [OID.1.2.840.113549.1.12.1.6, 1.2.840.113549.1.12.1.6]
- Serviciul este: SunJCE: AlgorithmParameters.DESede -> com.sun.crypto.provider.DESedeParameters aliases: [TripleDES]
- Serviciul este: SunJCE: SecretKeyFactory.DES -> com.sun.crypto.provider.DESKeyFactory
- Serviciul este: SunSASL: SaslServerFactory.DIGEST-MD5 -> com.sun.security.sasl.digest.FactoryImpl
- Serviciul este: SunJCE: SecretKeyFactory.PBEWithMD5AndDES -> com.sun.crypto.provider.PBEKeyFactory aliases: [OID.1.2.840.113549.1.5.3, 1.2.840.113549.1.5.3]
- Serviciul este: SunJCE: Mac.HmacSHA256 -> com.sun.crypto.provider.HmacCore$HmacSHA256 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SunJSSE: SSLContext.SSLv3 -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- Serviciul este: SunJSSE: TrustManagerFactory.PKIX -> com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$PKIXFactory aliases: [SunPKIX, X509, X.509]
- Serviciul este: SunRsaSign: Signature.SHA1withRSA -> sun.security.rsa.RSASignature$SHA1withRSA aliases: [1.2.840.113549.1.1.5, OID.1.2.840.113549.1.1.5, 1.3.14.3.2.29] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SunJCE: KeyGenerator.DESede -> com.sun.crypto.provider.DESedeKeyGenerator aliases: [TripleDES]
- Serviciul este: SunJCE: KeyGenerator.ARCFOUR -> com.sun.crypto.provider.KeyGeneratorCore$ARCFOURKeyGenerator aliases: [RC4]
- Serviciul este: SunJCE: AlgorithmParameters.DES -> com.sun.crypto.provider.DESParameters
- Serviciul este: SUN: MessageDigest.MD2 -> sun.security.provider.MD2
- Serviciul este: SunJSSE: SSLContext.TLS -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- Serviciul este: SunJCE: AlgorithmParameters.PBEWithSHA1AndRC2_40 -> com.sun.crypto.provider.PBEParameters aliases: [OID.1.2.840.113549.1.12.1.6, 1.2.840.113549.1.12.1.6]
- Serviciul este: SUN: CertificateFactory.X.509 -> sun.security.provider.X509Factory aliases: [X509] attributes: {ImplementedIn=Software}
- Serviciul este: SunJSSE: Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA aliases: [1.2.840.113549.1.1.2, OID.1.2.840.113549.1.1.2]
- Serviciul este: SunJCE: Cipher.ARCFOUR -> com.sun.crypto.provider.ARCFOURCipher aliases: [RC4] attributes: {SupportedModes=ECB, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING}
- Serviciul este: SunJCE: Cipher.RSA -> com.sun.crypto.provider.RSACipher attributes: {SupportedModes=ECB, SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey, SupportedPaddings=NOPADDING|PKCS1PADDING|OAEPWITHMD5ANDMGF1PADDING|OAEPWITHSHA1ANDMGF1PADDING|OAEPWITHSHA-1ANDMGF1PADDING|OAEPWITHSHA-256ANDMGF1PADDING|OAEPWITHSHA-384ANDMGF1PADDING|OAEPWITHSHA-512ANDMGF1PADDING}
- Serviciul este: SUN: KeyStore.JKS -> sun.security.provider.JavaKeyStore$JKS attributes: {ImplementedIn=Software}
- Serviciul este: SunJCE: Mac.HmacSHA384 -> com.sun.crypto.provider.HmacCore$HmacSHA384 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SunJCE: KeyGenerator.AES -> com.sun.crypto.provider.AESKeyGenerator aliases: [Rijndael]
- Serviciul este: SUN: Signature.NONEwithDSA -> sun.security.provider.DSA$RawDSA aliases: [RawDSA] attributes: {SupportedKeyClasses=java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey}
- Serviciul este: SunJCE: Cipher.Blowfish -> com.sun.crypto.provider.BlowfishCipher attributes: {SupportedModes=ECB|CBC|PCBC|CTR|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}
- Serviciul este: SunJGSS: GssApiMechanism.1.2.840.113554.1.2.2 -> sun.security.jgss.krb5.Krb5MechFactory
- Serviciul este: SunJCE: SecretKeyFactory.DESede -> com.sun.crypto.provider.DESedeKeyFactory aliases: [TripleDES]
- Serviciul este: SunJCE: KeyGenerator.Blowfish -> com.sun.crypto.provider.BlowfishKeyGenerator
- Serviciul este: SunJCE: KeyGenerator.RC2 -> com.sun.crypto.provider.KeyGeneratorCore$RC2KeyGenerator
- Serviciul este: SunJCE: Cipher.DESedeWrap -> com.sun.crypto.provider.DESedeWrapCipher attributes: {SupportedModes=CBC, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING}
- Serviciul este: SunJCE: AlgorithmParameters.RC2 -> com.sun.crypto.provider.RC2Parameters
- Serviciul este: SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher aliases: [Rijndael] attributes: {SupportedModes=ECB|CBC|PCBC|CTR|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}
- Serviciul este: SunJCE: KeyGenerator.HmacMD5 -> com.sun.crypto.provider.HmacMD5KeyGenerator
- Serviciul este: SunJCE: Mac.HmacMD5 -> com.sun.crypto.provider.HmacMD5 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SUN: MessageDigest.MD5 -> sun.security.provider.MD5 attributes: {ImplementedIn=Software}
- Serviciul este: SunRsaSign: Signature.SHA512withRSA -> sun.security.rsa.RSASignature$SHA512withRSA aliases: [1.2.840.113549.1.1.13, OID.1.2.840.113549.1.1.13] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SUN: CertStore.LDAP -> sun.security.provider.certpath.LDAPCertStore attributes: {ImplementedIn=Software, LDAPSchema=RFC2587}
- Serviciul este: SunJSSE: TrustManagerFactory.SunX509 -> com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$SimpleFactory
- Serviciul este: SUN: SecureRandom.SHA1PRNG -> sun.security.provider.SecureRandom attributes: {ImplementedIn=Software}
- Serviciul este: SunJCE: Cipher.PBEWithMD5AndTripleDES -> com.sun.crypto.provider.PBEWithMD5AndTripleDESCipher
- Serviciul este: SunJCE: KeyStore.JCEKS -> com.sun.crypto.provider.JceKeyStore
- Serviciul este: SunJCE: AlgorithmParameters.Blowfish -> com.sun.crypto.provider.BlowfishParameters
- Serviciul este: SunJCE: SecretKeyFactory.PBEWithSHA1AndRC2_40 -> com.sun.crypto.provider.PBEKeyFactory aliases: [OID.1.2.840.113549.1.12.1.6, 1.2.840.113549.1.12.1.6]
- Serviciul este: SunJCE: Cipher.RC2 -> com.sun.crypto.provider.RC2Cipher attributes: {SupportedModes=ECB|CBC|PCBC|CTR|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}
- Serviciul este: SunJSSE: Signature.MD5andSHA1withRSA -> com.sun.net.ssl.internal.ssl.RSASignature
- Serviciul este: SunJCE: SecretKeyFactory.PBEWithSHA1AndDESede -> com.sun.crypto.provider.PBEKeyFactory aliases: [OID.1.2.840.113549.1.12.1.3, 1.2.840.113549.1.12.1.3]
- Serviciul este: SunJCE: KeyGenerator.HmacSHA1 -> com.sun.crypto.provider.HmacSHA1KeyGenerator
- Serviciul este: SunJCE: AlgorithmParameters.PBEWithMD5AndTripleDES -> com.sun.crypto.provider.PBEParameters
- Serviciul este: SunJSSE: KeyManagerFactory.SunX509 -> com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509
- Serviciul este: SunJCE: AlgorithmParameters.PBEWithMD5AndDES -> com.sun.crypto.provider.PBEParameters aliases: [OID.1.2.840.113549.1.5.3, 1.2.840.113549.1.5.3]
- Serviciul este: SUN: Signature.SHA1withDSA -> sun.security.provider.DSA$SHA1withDSA aliases: [DSA, DSS, SHA/DSA, SHA-1/DSA, SHA1/DSA, SHAwithDSA, DSAWithSHA1, OID.1.2.840.10040.4.3, 1.2.840.10040.4.3, 1.3.14.3.2.13, 1.3.14.3.2.27] attributes: {ImplementedIn=Software, KeySize=1024, SupportedKeyClasses=java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey}
- Serviciul este: SunRsaSign: Signature.MD2withRSA -> sun.security.rsa.RSASignature$MD2withRSA aliases: [1.2.840.113549.1.1.2, OID.1.2.840.113549.1.1.2] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SunRsaSign: Signature.MD5withRSA -> sun.security.rsa.RSASignature$MD5withRSA aliases: [1.2.840.113549.1.1.4, OID.1.2.840.113549.1.1.4] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SunJCE: Mac.HmacSHA512 -> com.sun.crypto.provider.HmacCore$HmacSHA512 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SunJCE: AlgorithmParameterGenerator.DiffieHellman -> com.sun.crypto.provider.DHParameterGenerator aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1]
- Serviciul este: SUN: CertPathValidator.PKIX -> sun.security.provider.certpath.PKIXCertPathValidator attributes: {ImplementedIn=Software, ValidationAlgorithm=RFC3280}
- Serviciul este: SUN: CertStore.Collection -> sun.security.provider.certpath.CollectionCertStore attributes: {ImplementedIn=Software}
- Serviciul este: SunJCE: Cipher.AESWrap -> com.sun.crypto.provider.AESWrapCipher attributes: {SupportedModes=ECB, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING}
- Serviciul este: SunJCE: AlgorithmParameters.DiffieHellman -> com.sun.crypto.provider.DHParameters aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1]
- Serviciul este: SUN: CertStore.com.sun.security.IndexedCollection -> sun.security.provider.certpath.IndexedCollectionCertStore attributes: {ImplementedIn=Software}
- Serviciul este: SunJCE: AlgorithmParameters.PBEWithSHA1AndDESede -> com.sun.crypto.provider.PBEParameters aliases: [OID.1.2.840.113549.1.12.1.3, 1.2.840.113549.1.12.1.3]
- Serviciul este: SunSASL: SaslClientFactory.DIGEST-MD5 -> com.sun.security.sasl.digest.FactoryImpl
- Serviciul este: SunRsaSign: KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- Serviciul este: SunJSSE: Signature.MD5withRSA -> sun.security.rsa.RSASignature$MD5withRSA aliases: [1.2.840.113549.1.1.4, OID.1.2.840.113549.1.1.4]
- Serviciul este: SUN: AlgorithmParameters.DSA -> sun.security.provider.DSAParameters aliases: [1.3.14.3.2.12, 1.2.840.10040.4.1] attributes: {ImplementedIn=Software}
- Serviciul este: SunSASL: SaslClientFactory.EXTERNAL -> com.sun.security.sasl.ClientFactoryImpl
- Serviciul este: SUN: KeyFactory.DSA -> sun.security.provider.DSAKeyFactory aliases: [1.3.14.3.2.12, 1.2.840.10040.4.1] attributes: {ImplementedIn=Software}
- Serviciul este: SUN: MessageDigest.SHA-256 -> sun.security.provider.SHA2
- Serviciul este: SunJCE: SecretKeyFactory.PBEWithMD5AndTripleDES -> com.sun.crypto.provider.PBEKeyFactory
- Serviciul este: SunJCE: Mac.HmacSHA1 -> com.sun.crypto.provider.HmacSHA1 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SunJCE: AlgorithmParameters.OAEP -> com.sun.crypto.provider.OAEPParameters
- Serviciul este: SunJCE: Cipher.PBEWithSHA1AndDESede -> com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede aliases: [OID.1.2.840.113549.1.12.1.3, 1.2.840.113549.1.12.1.3]
- Serviciul este: SunJCE: KeyGenerator.HmacSHA512 -> com.sun.crypto.provider.KeyGeneratorCore$HmacSHA512KG
- Serviciul este: SunJCE: KeyGenerator.DES -> com.sun.crypto.provider.DESKeyGenerator
- Serviciul este: SunJCE: KeyGenerator.HmacSHA256 -> com.sun.crypto.provider.KeyGeneratorCore$HmacSHA256KG
- Serviciul este: SunJSSE: SSLContext.SSL -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- Serviciul este: SUN: CertPathBuilder.PKIX -> sun.security.provider.certpath.SunCertPathBuilder attributes: {ImplementedIn=Software, ValidationAlgorithm=RFC3280}
- Serviciul este: SunJCE: Cipher.DES -> com.sun.crypto.provider.DESCipher attributes: {SupportedModes=ECB|CBC|PCBC|CTR|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}
- Serviciul este: SunRsaSign: Signature.SHA256withRSA -> sun.security.rsa.RSASignature$SHA256withRSA aliases: [1.2.840.113549.1.1.11, OID.1.2.840.113549.1.1.11] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SunJSSE: KeyStore.PKCS12 -> com.sun.net.ssl.internal.ssl.PKCS12KeyStore
- Serviciul este: SUN: MessageDigest.SHA-384 -> sun.security.provider.SHA5$SHA384
- Serviciul este: SUN: KeyPairGenerator.DSA -> sun.security.provider.DSAKeyPairGenerator aliases: [OID.1.2.840.10040.4.1, 1.2.840.10040.4.1, 1.3.14.3.2.12] attributes: {ImplementedIn=Software, KeySize=1024}
- Serviciul este: SunJCE: Cipher.PBEWithMD5AndDES -> com.sun.crypto.provider.PBEWithMD5AndDESCipher aliases: [OID.1.2.840.113549.1.5.3, 1.2.840.113549.1.5.3]
- Serviciul este: SunSASL: SaslServerFactory.GSSAPI -> com.sun.security.sasl.gsskerb.FactoryImpl
- Serviciul este: SunJCE: SecretKeyFactory.PBE -> com.sun.crypto.provider.PBEKeyFactory
- Serviciul este: SunJCE: Cipher.DESede -> com.sun.crypto.provider.DESedeCipher aliases: [TripleDES] attributes: {SupportedModes=ECB|CBC|PCBC|CTR|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64, SupportedKeyFormats=RAW, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}
- Serviciul este: SUN: MessageDigest.SHA -> sun.security.provider.SHA aliases: [SHA-1, SHA1] attributes: {ImplementedIn=Software}
- Serviciul este: SunJSSE: KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- Serviciul este: SunSASL: SaslClientFactory.CRAM-MD5 -> com.sun.security.sasl.ClientFactoryImpl
- Serviciul este: SunJSSE: KeyManagerFactory.NewSunX509 -> com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$X509
- Serviciul este: SunJCE: Mac.HmacPBESHA1 -> com.sun.crypto.provider.HmacPKCS12PBESHA1 attributes: {SupportedKeyFormats=RAW}
- Serviciul este: SunSASL: SaslClientFactory.GSSAPI -> com.sun.security.sasl.gsskerb.FactoryImpl
- Serviciul este: SunJSSE: SSLContext.TLSv1 -> com.sun.net.ssl.internal.ssl.SSLContextImpl
- Serviciul este: SunRsaSign: KeyFactory.RSA -> sun.security.rsa.RSAKeyFactory aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- Serviciul este: SunJCE: AlgorithmParameters.PBE -> com.sun.crypto.provider.PBEParameters
- Serviciul este: SUN: MessageDigest.SHA-512 -> sun.security.provider.SHA5$SHA512
- Serviciul este: SunJCE: KeyFactory.DiffieHellman -> com.sun.crypto.provider.DHKeyFactory aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1]
- Serviciul este: SunSASL: SaslServerFactory.CRAM-MD5 -> com.sun.security.sasl.ServerFactoryImpl
- Serviciul este: SunJCE: KeyGenerator.HmacSHA384 -> com.sun.crypto.provider.KeyGeneratorCore$HmacSHA384KG
- Serviciul este: SunJCE: KeyAgreement.DiffieHellman -> com.sun.crypto.provider.DHKeyAgreement aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1] attributes: {SupportedKeyClasses=javax.crypto.interfaces.DHPublicKey|javax.crypto.interfaces.DHPrivateKey}
- Serviciul este: SUN: KeyStore.CaseExactJKS -> sun.security.provider.JavaKeyStore$CaseExactJKS
- Serviciul este: SunJSSE: Signature.SHA1withRSA -> sun.security.rsa.RSASignature$SHA1withRSA aliases: [1.2.840.113549.1.1.5, OID.1.2.840.113549.1.1.5, 1.3.14.3.2.29, OID.1.3.14.3.2.29]
- Serviciul este: SunJSSE: KeyPairGenerator.RSA -> sun.security.rsa.RSAKeyPairGenerator aliases: [1.2.840.113549.1.1, OID.1.2.840.113549.1.1]
- Serviciul este: SunRsaSign: Signature.SHA384withRSA -> sun.security.rsa.RSASignature$SHA384withRSA aliases: [1.2.840.113549.1.1.12, OID.1.2.840.113549.1.1.12] attributes: {SupportedKeyClasses=java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey}
- Serviciul este: SUN: AlgorithmParameterGenerator.DSA -> sun.security.provider.DSAParameterGenerator attributes: {ImplementedIn=Software, KeySize=1024}
- Serviciul este: SunSASL: SaslClientFactory.PLAIN -> com.sun.security.sasl.ClientFactoryImpl
- Serviciul este: SunJCE: AlgorithmParameters.AES -> com.sun.crypto.provider.AESParameters aliases: [Rijndael]
- Serviciul este: SunJCE: KeyPairGenerator.DiffieHellman -> com.sun.crypto.provider.DHKeyPairGenerator aliases: [DH, OID.1.2.840.113549.1.3.1, 1.2.840.113549.1.3.1]
Tuesday, January 24, 2006
Extensia de criptografie Java (JCE)
- Caracteristici generale
JCE implementeaza servicii criptografice specificate in cadrul mai larg al JCA (furrnizorul de servicii criptografice "SunJCE")- cifrurile DES, Triple DES, Blowfish in modurile
- ECB
- CBC
- CFB
- OFB
- PCBC
- generatoare de chei pentru
- DES
- Triple DES
- Blowfish
- HMAC-MD5
- HMAC-SHA1
- MD5 cu PBE pentru DES-CBC (PKCS#5)
- generatoare de obiecte cheie si conversia catre/de la informatia de cheie pentru cifruri simetrice: DES, Triple DES si PBE si asimetrice: Diffie-Hellman
- acordul Diffie-Hellman asupra cheilor pentru mai multe entitati
- generator Diffie-Hellman de perechi de chei
- generator de parametri pentru algoritmul Diffie-Hellman
- implementare HMAC-MD5 si HMAC-SHA1 pentru algoritmi de hash (RFC 2104)
- implementare pentru schema de aliniere PKCS#5
- magazia de chei, JCEKS, pentru schema proprietara
- cifrurile DES, Triple DES, Blowfish in modurile
- Detalii
- Clase de baza
- clasa cifru
- crearea unui obiect Cipher
- public static Cipher getInstance(String transformation)
- public static Cipher getInstance(String transformation , String provider)
- "algorithm/mode/padding"
- "algorithm"
- algorithm
- AES
- ARCFOUR/RC4
- Blowfish
- DES
- DESede
- ECIES
- PBEWith<digest>And<encryption> sau PBEWith<prf>And<encryption>
- RC2, RC4 sau RC5
- RSA
- mode
- NONE
- CBC (FIPS PUB 81)
- CFB (FIPS PUB 81)
- ECB (FIPS PUB 81)
- OFB (FIPS PUB 81)
- PCBC (Kerberos v4)
- padding
- ISO10126Padding
- NoPadding
- OAEPWith<digest>And<mgf>Padding (Optimal Asymmetric Encryption Padding, PKCS#1)
- PKCS5Padding
- SSL3Padding
- initializarea unui obiect Cipher
- public void init(int opmode , Key key)
- public void init(int opmode , Certificate certificate )
- public void init(int opmode , Key key , SecureRandom random)
- public void init(int opmode , Certificate certificate , SecureRandom random)
- public void init(int opmode , Key key , AlgorithmParameterSpec params)
- public void init(int opmode , Key key , AlgorithmParameterSpec params, SecureRandom random)
- public void init(int opmode , Key key , AlgorithmParameters params)
- public void init(int opmode , Key key , AlgorithmParameters params, SecureRandom random)
- ENCRYPT_MODE
criptare - DECRYPT_MODE
decriptare - WRAP_MODE
impachetarea cheii pentru transport - UNWRAP_MODE
despachetarea cheii intr-un obiect java.security.Key
- criptarea si decriptarea
- intr-un singur pas
- public byte[] doFinal(byte[] input)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen , byte[] output)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen , byte[] output , int outputOffset)
- in mai multi pas
- apel repetat pentru metodele
- public byte[] update(byte[] input)
- public byte[] update(byte[] input , int inputOffset , int inputLen)
- public byte[] update(byte[] input , int inputOffset , int inputLen , byte output)
- public byte[] update(byte[] input , int inputOffset , int inputLen , byte output , int outputOffset)
- urmate de un singur apel al
- public byte[] doFinal(byte[] input)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen , byte[] output)
- public byte[] doFinal(byte[] input , int inputOffset , int inputLen , byte[] output , int outputOffset)
- public byte[] doFinal()
- public byte[] doFinal(byte[] input , int outputOffset)
orice apel la o metoda doFinal reseteaza obiectul aducandu-l in starea de dupa initializare
- apel repetat pentru metodele
- intr-un singur pas
- impachetarea si despachetarea cheilor
- impachetarea
public final byte[] wrap(Key key) - despachetarea
sunt necesare- cheia impachetata
- numele algoritmului pentru cheie
- tipul cheii impachetate (Cipher.SECRET_KEY, Cipher.PRIVATE_KEY , Cipher.PUBLIC_KEY)
public final Key unwrap(byte[] wrappedKey , String wrappedKeyAlgorithm , int wrappedKeyType)
- impachetarea
- gestionarea parametrilor algoritmului
- consideratii asupra iesirii
daca se utilizeaza una dintre metodele doFinal care permite specificarea buffer-ului de iesire se poate utiliza metoda
public int getOutputSize(int inputLen)
pentru a verifica daca acesta este suficient
- clase cifru fluide
- clasa cifru fluid de intrare
- CipherInputStream
este un FilterInputStream care foloseste un Cipher (care trebuie initializat inainte de utilizarea CipherInputStream);este importanta utilizarea doar a metodelor care au fost suprascrise sau definite in aceasta clasa;- clasa cifru fluid de iesire
- CipherOutputStream
- clasa generator de chei
pentru algoritmi simetrici- crearea unui obiect KeyGenerator
- public static KeyGenerator getInstance(String algorithm)
- public static KeyGenerator getInstance(String algorithm , String provider)
- AES
- ARCFOUR/RC4
- Blowfish
- DES
- DESeed
- HmacMD5
- HmacSHA1
- HmacSHA256
- HmacSHA384
- HmacSHA512
- RC2
- initializarea unui obiect KeyGenerator
- initializare independenta de algoritm
- public void init (SecureRandom random)
- public void init(int keysize)
- public void init (int keysize , SecureRandom random)
- initializare specifica unui algoritm
- public void init(AlgorithmParameterSpec params)
- public void init(AlgorithmParameterSpec params , SecureRandom random)
- initializare independenta de algoritm
- crearea unei chei
public SecretKey generateKey()
- clasa convertor obiecte cheie/specificatii de cheie pentru chei simetrice
- un obiect javax.crypto.SecretKeyFactory lucreaza pe chei simetrice
- un obiect java.security.KeyFactory lucreaza pe o pereche de chei asimetrice
- clasa obiect sigilat
- un obiect a carui confidentialitate este asigurata de un algoritm criptografic
- clasa acord asupra cheilor
- asigura functionalitatea unui protocol de acord asupra cheilor
cheile implicate implicate in distributia unui secret sunt create- de catre generatoare de chei: KeyPairGenerator, KeyGenerator
- de catre KeyFactory
- ca rezultat al unei faze intermediare a unui protocol de acord asupra cheilor
- crearea unui obiect KeyAgreement
- public static KeyAgreement getInstance(String algorithm)
- public static KeyAgreement getInstance(String algorithm , String provider)
- DiffieHellman (PKCS#3)
- ECDH (Elliptic Curve Diffie-Hellman, RFC3278)
- ECMQV (Elliptic Curve Menezes-Qu-Vanstone)
- initializarea unui obiect KeyAgreement
initializarea se face cu o cheie privata si suplimentar prin specificarea unei surse pseudoaleatoare si a unei multimi de parametri de algoritm- public void init(Key key)
- public void init(Key key , SecureRandom random)
- public void init(Key key , AlgorithmParameterSpec params)
- public void init(Key key , AlgorithmParameterSpec params , SecureRandom random)
- realizarea fazei de acord
rularea cel putin o data a metodei
public Key doPhase(Key key , boolean lastPhase)
pentru care key este o cheie publica sau o cheie interemediara generata in faza anterioara - generarea secretului partajat
prin apelul uneia din metodele- public byte[] generateSecret()
- public int generateSecret(byte[] sharedSecret , int offset)
- public SecretKey generateSecret(String algorithm)
- clasa cod de autentificare mesaj
- crearea unui obiect Mac
- public static Mac getInstance(String algorithm)
- public static Mac getInstance(String algorithm , String provider)
- HmacMD5
- HmacSHA1
- HmacSHA256
- HmacSHA384
- HmacSHA512
- PBEWith<mac>
- initializarea unui obiect Mac
- public void init(Key key)
- public void init(Key key , AlgorithmParameterSpec params)
- calcularea valorii de MAC
- intr-un singur pas
public byte[] doFinal(byte[] input) - in mai multi pasi
apel repetat la una dintre metodele- public void update(byte input)
- public void update(byte[] input)
- public void update(byte[] input , int inputOffset , int inputLen)
- public byte[] doFinal()
- public byte[] doFinal(byte[] input)
- public byte[] doFinal(byte[] output , int outOffset)
- intr-un singur pas
Arhitectura de criptografie JAVA
- JCA (Java Cryptography Architecture)
- este un cadru de lucru ce permite accesarea si dezvoltarea de functiuni criptografice in platforma Java
obiective- independenta implementarii si interoperabilitate
- independenta algoritmilor si extensibilitate
- serviciu criptografic
- un algoritm sau un tip care fie asigura operatii criptografice (ex: semnaturi digitale) fie genereaza sau furnizeaza informatie criptografica (ex: chei sau parametri) fie genereaza obiecte date (ex: magazii de chei sau certificate) care incapsuleaza chei
- furnizor de servicii criptografice
- un pachet care implementeaza o submultime a cerintelor prevazute in "Security Architecture" legate de criptografie
- furnizorul implicit de servicii criptografice - SunJCE
- este implementat de Sun si include implementari pentru:
- DSA
- MD5 si SHA-1
- generator de perechi de chei publica/privata prin algoritmul DSA
- generator de parametri prin algoritmul DSA
- gestionar de parametri generati prin algoritmul DSA
- generator de chei prin algoritmul DSA cu facilitate de conversie intre perechile de chei publica/privata si informatia de cheie
- generator de numere pseudoaleatoare conform cu IEEE-P1363
- constructor de cai de certificare (X.509) si validator pentru infrastructura de chei publice (cu revocare prin liste - CRL)
- stocarea si revocarea certificatelor prin CRL si LDAP
- generator de certificate X.509 si CRL
- stocare de chei pentru stocare proprietara - JKS
-
marimile implicite ale cheilor
- generator de cheie
- DES: 56 biti
- TripleDES: 112 biti
- Blowfish: 56 biti
- HmacMD5: 64 biti
- HmacSHA1: 64 biti
- generator de perechi de chei
Diffie-Hellman: 1024 biti - generator parametri algoritm
Diffie-Hellman: 1024 biti
- clasa motor
- defineste un serviciu criptografic intr-o maniera abstracta; o asemenea clasa asigura o interfata (interfata abstracta SPI - Service Provider Interface) pentru un tip de serviciu criptografic specificat; o instanta a unei clase motor ( contine ca un camp membru privat o instanta a clasei SPI corespondente care are acelasi nume cu cel al clasei motor) se creeaza printr-un apel la metoda getInstance a clasei motor; clasele SPI sunt abstracte astfel ca un furnizor de servicii criptografice trebuie sa contina clase derivate si implementari ale metodelor abstracte
- JCA contine
- clasele din pachetul "Java SDK Security" legate de criptografie
- Provider
- este interfata catre furnizorul de servicii criptografice
realizeaza inregistrarea serviciilor criptografice si poate fi folosita pentru a inregistra servicii de securitate
la crearea unei instante pentru o clasa motor se poate specifica optional furnizorul de servicii criptografice; daca nu se specifica, metoda getInstance cauta furnizorii care implementeaza serviciul criptografic cerut asociat cu numele algoritmului; Orice JVM are o lista de preferinte pentru aceasta cautare-
instalarea unui furnizor de servicii criptografice
- instalarea
inserarea in "classpath" a cai unde se afla jar-ul sau zip-ul - configurarea
se insereaza in fisierul java.security o linie "security.provider.n = masterClassName"
-
metode
- public String getName()
- public double getVersion()
- public String getInfo()
- este interfata catre furnizorul de servicii criptografice
- Security
- contine metode statice, nu se instantiaza si gestioneaza furnizorii de servicii criptografice si setarile generale de securitate care pot fi apelate numai in programe de incredere
un program de incredere este:- o aplicatie locala care ruleaza sub un gestionar de securitate
- un applet sau o aplicatie care are drepturi de rulare a acestor metode
intr-un fisier de configurare a politicii, codul sursa este reprezentat prin URL si alias
ex:-
grant codeBase "...", signedBy "..." (
- permission java.security.SecurityPermisssion "insertProvider.";
- permission java.security.SecurityPermisssion "removeProvider.";
- permission java.security.SecurityPermisssion "putProviderProperty."; };
-
metode
- gestionarea furnizorilor
functie nume metoda obs. interogare static Provider[] getProvider() ordinea in vector este data de ordinea de preferinta a furnizorilor interogare static Provider getProvider(Stirng providerName) adaugare static int addProvider(Provider provider) adauga la sfarsitul listei si returneaza ordine de preferinta sau -1 daca furnizorul exista deja adaugare insertProviderAt(Provider provider , int position) insereaza in lista la pozitia "position", aluneca in jos restul listei si returneaza ordinea de preferinta stergere static void removeProvider(String name) dupa stergerea furnizorului componentele listei sunt alunecate in fata cu o pozitie - proprietati de securitate
- static String getProperty(String key)
- static String setProperty(String key , String datum)
- contine metode statice, nu se instantiaza si gestioneaza furnizorii de servicii criptografice si setarile generale de securitate care pot fi apelate numai in programe de incredere
- Provider
- clase motor
- MessageDigest
- calcularea unei valori de hash
- crearea unui obiect MessageDigest
- static MessageDigest getInstance(String algorithm)
- static MessageDigest getInstance(String algorithm , String provider)
- static MessageDigest getInstance(String algorithm , Provider provider)
- incarcarea mesajului in obiectul creat
- void update(byte input)
- void update(byte[] input)
- void update(byte[] input , int offset , int len)
- calcularea valorii de hash
- byte[] digest()
- byte[] digest(byte[] input)
- byte[] digest(byte[] input , int offset , int len)
- Signature
- semnarea si verificarea digitala
un obiect Signature este modal (este intotdeauna intr-o stare data si poate face o singura operatie)-
starile unui obiect Signature
- UNINITIALIZED - starea imediat la crearea obiectului
- SIGN - obiect pentru semnare
- VERIFY - obiect pentru verificare verificare
- crearea unui obiect Signature
- static Signature getInstance(String algorithm)
- static Signature getInstance(String algorithm , String provider)
- static Signature getInstance(String algorithm , Provider provider)
-
initializarea unui obiect Signature
- final void initSign(PrivateKey privateKey) - obiectul este pus in starea SIGN
- final void initVerify(PublicKey publicKey) - obiectul este pus in starea VERIFY
- final void initVerify(Certificate certificate) - obiectul este pus in starea VERIFY acelasi obiect poate fi folosit si la semnare si la verificare
- semnarea
-
incarcarea cu date
- final void update(byte b)
- final void update(byte[] data)
- final void update(byte[] data , int off , int len)
-
generarea semnaturii
- final byte[] sign()
- final int sign(byte[] outbuf , int offset , int len)
- verificarea
-
incarcarea cu date
- final void update(byte b)
- final void update(byte[] data)
- final void update(byte[] data , int off , int len) dupa apel obiectul ajunge in starea SIGN
-
generarea semnaturii
- final boolean verify(byte[] signature)
- final boolean verify(byte[] signature , int offset , int length) dupa apel obiectul ajunge in starea VERIFY
- KeyPairGenerator
- generarea unei perechi de chei publica/privata
- crearea unui obiect KeyPairGenerator
- static KeyPairGenerator getInstance(String algorithm)
- static KeyPairGenerator getInstance(String algorithm , String provider)
- static KeyPairGenerator getInstance(String algorithm , Provider provider)
- initializarea unui obiect KeyPairGenerator
- independent de algoritm
- void initialize(int keysize , SecureRandom random)
- void initialize(int keysize) este la latitudinea furnizorului ceea ce se intampla cu parametrii specifici algoritmului
- specific unui algoritm
- void initialize (AlgorithmParameterSpec params , SecureRandom random)
- void initialize (AlgorithmParameterSpec params)
- independent de algoritm
- generarea unei perechi de chei
KeyPair generateKeyPair()
- KeyFactory
- conversia intre tipul criptografic Key si specificatiile de cheie care sunt reprezentari transparente ale informatiile de cheie
un asemenea obiect poate fi utilizat la conversia intre specificatii compatibile de chei- crearea unui obiect KeyFactory
- static KeyFactory getInstance(String algorithm)
- static KeyFactory getInstance(String algorithm , String provider)
- static KeyFactory getInstance(String algorithm , Provider provider)
- conversia de la o specificatie de cheie la un obiect cheie
- PublicKey generatePublic(KeySpec keySpec)
- PrivateKey generatePrivate(KeySpec keySpec)
- conversia de la un obiect cheie la o specificatie de cheie
- KeySpec getKeySpec(Key key , Class keySpec)
- CertificateFactory
- crearea obiectelor certificate cu cheie publica si a listelor de revocare certificate (CRL) dintr-o codificarea adecvata
un asemenea obiect pentru X.509 returneaza o instanta a java.security.cert.X509Certificate si un CRL care este instanta a java.security.cert.X509CRL- crearea unui obiect CertificateFactory
- static CertificateFactory getInstance(String type)
- static CertificateFactory getInstance(String type , String provider)
- static CertificateFactory getInstance(String type , Provider provider)
- generarea obiectelor certificat
- final Certificate generateCertificates(InputStream inStream)
- final Collection generateCertificates(InputStream inStream)
- generarea obiectelor CRL
- final CRL generateCRL(InputStream inStream)
- final Collection generateCRL(InputStream inStream)
- generarea obiectelor CertPath
- final CertPath generateCertPath(InputStream inStream)
- final CertPath generateCertPath(InputStream inStream , String encoding)
- final CertPath generateCertPath(List certificates)
- final Iterator getCertPathEncodings()
- KeyStore
- generarea si gestionarea unei baze de date a cheilor si stocarea certificatelor; cheile private au asociat un lant de certificare ceea ce autentifica cheile publice
aceasta clasa reprezinta o stocare in memorie a colectiilor de chei si certificate- cheie
este secreta sau privata, stocata in format protejat - certificat de incredere
certificat cu cheie publica
- crearea unui obiect KeyStore
- static KeyStore getInstance(String type)
- static KeyStore getInstance(String type , String provider)
- static KeyStore getInstance(String type , Provider provider)
- incarcarea in memorie a unui obiect KeyStore
pentru a putea fi utilizat o instanta a acestei clase trebuie incarcata in memorie
final void load( InputStream , char[] password)
parola este optionala si daca este furnizata se va face o verificare de integritate - obtinerea unei liste a alias-uri dintr-un obiect KeyStore
final Enumeration aliases() - determinarea tipurilor intrarilor stocat intr-un obiect KeyStore
- final boolean isKeyEntry( String alias)
- final boolean isCertificateEntry( String alias)
- adaugarea/modificarea si stergerea intrarilor dintr-un obiect KeyStore
- adaugare/modificare
- certificate
final void setCertificateEntry( String alias , Certificate entry) - chei
- final void setKeyEntry( String alias , Key key , char[] password , Certificate[] chain)
- final void setKeyEntry( String alias , byte[] key , Certificate[] chain)
array-ul de octeti este in format protejat
- certificate
- stergere
final void deleteEntry(String alias)
- adaugare/modificare
- obtinerea intrarilor stocate intr-un obiect KeyStore
- certificate
- final Certificate getCertificate(String alias)
- final Certificate[] getCertificate(String alias)
- final String getCertificateAlias(Certificate cert)
- chei
final Key getKey(String alias , char[] password)
- certificate
- salvarea unui obiect KeyStore
final void store(OutputStream stream , char[] password)
- AlgorithmParameters
- gestionarea parametrilor unui algoritm
reprezentarea nu este trasnparenta, neobtinandu-se accesul direct la parametri ci numai numele algoritmului asociat multimiii parametrilor si o codificare a acestora- crearea unui obiect AlgorithmParameters
- static AlgorithmParameters getInstance( String algorithm)
- static AlgorithmParameters getInstance( String algorithm , String provider)
- static AlgorithmParameters getInstance( String algorithm , Provider provider)
- initializarea unui obiect AlgorithmParameters
- void init(AlgorithmParameterSpec paramSpec)
- void init(byte[] params)
- void init(byte[] params , String format) params este un array de octeti codificati, format este numele decodificarii (daca lipseste se utilizeaza formatul de decodificare primar care este ASN.1)
- obtinerea codificarii parametrilor
- codificarea in forma primara
byte[] getEncoded() - cu specificarea codificarii
byte[] getEncoded( String format)
- codificarea in forma primara
- obtinerea parametrilor in mod transparent
AlgorithmParameterSpec getParameterSPec(Class paramSpec)
- AlgorithmParameterGenerator
- generarea unei multimi de parametri pentru un algoritm specificat
- crearea unui obiect AlgorithmParameterGenerator
- static AlgorithmParameterGenerator getInstance( String algorithm)
- static AlgorithmParameterGenerator getInstance( String algorithm , String provider)
- static AlgorithmParameterGenerator getInstance( String Provider , String provider)
- initializarea unui obiect AlgorithmParameterGenerator
- generarea parametrilor
o data creat si initializat obiectul poate genera parametrii
AlgorithmParameters generateParameters()
- SecureRandom
- generarea de numere pseudoaleatoare
- crearea unui obiect SecureRandom
- static SecureRandom getInstance( String algorithm)
- static SecureRandom getInstance( String algorithm , String provider)
- static SecureRandom getInstance( String algorithm , Provider provider)
- initializarea cheii de generare
- synchronized public void setSeed( byte[] seed)
- public void setSeed( long seed)
- uzul unui obiect SecureRandom
synchronized public void nextBytes( byte[] bytes) - generarea de chei de generare
byte[] generateSeed ( int numBytes)
- CertPathBuilder
- construirea de cai de certificare
- instantierea clasei CertPathBuilder
- static CertPathBuilder getInstance( String algorithm)
- static CertPathBuilder getInstance( String algorithm , String provider)
- static CertPathBuilder getInstance( String algorithm , Provider provider)
- construirea unei cai de certificare
CertPathBuilderResult build (CertPathParameters params) - interogari
- furnizor
Provider getProvider() - algoritm
String getAlgoithm() - tip
static String getDefaultType()
returneaza tipul asa cum este specificat in fisierul de configurare de securitate sau "PKIX" altfel
- furnizor
- CertPathValidator
- validarea lanturilor (cailor) de certificate
- creare obiect CertPathValidator
- static CertPathValidator getInstance( String algorithm)
- static CertPathValidator getInstance( String algorithm , String provider)
- static CertPathValidator getInstance( String algorithm , Provider provider)
- validarea unei cai de certificare
CertPathValidatorResult validate( CertPath certPath , CertPathParameters params) - interogari
- String getAlgorithm()
- static String getDefaultType()
- Provider getProvider()
- CertStore
- obtinerea de certificate, care nu sunt de incredere, si CRL-uri (ex: CertStore implementat ca o implementare LDAP); utilizeaza o arhitectura specifica furnizorului de servicii criptografice;
- crearea unui obiect
- obtinerea unui certificat
- obtinerea ueni CRL
- interogari
- clase si interfete care implementeaza sau extind interfata Key (specificare opaca)
- o reprezentare opaca a unei chei se face fara a avea acces la informatia de cheie
o reprezentare transparenta a unei chei permite accesul la informatia de cheie
interfata Key este radacina ierarhiei pentru specificarea opaca a cheilor, definind functionalitatile necesare-
caracteristici
- algoritmul cheii
String getAlgorithm() - forma codificata
care se foloseste atunci cand este nevoie de reprezentarea standard (ex: X.509, PKCS#8) a cheii in afara JVM
byte[] getEncoded() - formatul
String getFormat()
-
mod de lucru
- obtinerea cheilor din
- generatoare de chei
- certificate
- specificatori de chei (prin KeyFactory)
- implementari ale KeyStore
- parsingul cheilor codificate, KeyFactory
- parsingul certificatelor, CertificateFactory
-
interfete care extind interfata Key (definita in pachetul java.security.interfaces)
- DHPrivateKey
- DHPublicKey
- DSAPrivateKey
- DSAPublicKey
- PBEKey
- PrivateKey
- PublicKey
- RSAMultiPrimePrivateCrtKey
- RSAPrivateCrtKey
- RSAPrivateKey
- RSAPublicKey
- SecretKey
- clase si interfete pentru specificarea parametrilor algoritmilor
- interfata AlgorithmParameterSpec
nu contine metode sau constante si are rolul de a grupa specificarile parametrilor - clasa DSAParameterSpec
este o implementare a interfetei AlgorithmParameterSpec ce specifica multimea parametrilor utilizati de algoritmul DSA
- clase si interfete pentru specificarea cheii (specificare tansparenta)
- interfete
interfata KeySpec nu contine metode sau constante si are rolul de a grupa specificarile parametrilor - clase
- DSAPrivateKeySpec
- DSAPublicKeySpec
- RSAPrivateKeySpec
- RSAPrivateCrtKeySpec
- RSAMultiPrimePrivateCrtKeySpec
- RSAPublicKeySpec
- EncodedKeySpec
Friday, January 20, 2006
Tehnici de gestionare a cheilor
- cadru de lucru
- context
- Gestionarea cheilor are loc in contextul politicii de securitate care defineste in mod implicit/explicit amenintarile la care trebuie sa faca fata un sistem si de aici cerintele criptografice.
Politica de securitate defineste- proceduri privitoare la aspectele tehnnice si administrative ale gestionarii cheilor
- responsabilitatile partilor
- tipurile de inregistrari care sa permita rapoarte ulterioare unui eveniment de securitate
- obiectiv
- pastrarea in siguranta a informatiilor referitoare la chei ai sa fie contracarate amenintari cum ar fi:
- compromiterea confidentialitatii cheilor secrete
- compromiterea autenticitatii cheilor secrete sau publice
- utilizarea neautorizata a cheilor publice sau secrete
- modele de distributie a cheilor
- problema distributiei cheilor
intr-un sistem cu chei simetrice cu n utilizatori, daca fiecare pereche de utilizatori partajeaza o cheie secreta distincta, numarul de chei este n ( n - 1 ) / 2, ceea ce pentru n mare conduce la un numar de chei inacceptabil de mare si de aici necesitatea unui server central - mecanisme
- punct la punct
A si B partajeaza a priori o cheie secreta - cu terta parte
A si B partajeaza fiecare o cheie secreta cu serverul- centru de distributie a cheilor (KDC)
KDC distirbuie chei utilizatorilor care partajeaza secrete cu acesta - centru de translatie a cheilor (KTC)
functioneaza ca un KDC dar cheia de sesiune este generata de una dintre parti
- centru de distributie a cheilor (KDC)
- punct la punct
- functii ale tertului, T
- clasificare dupa criteriul interactiunii in timp real
- in-line
T este un intermediar ce are rolulu de mijloc de comunicatie intre A si B - on-line
T este implicat in fiecare sesiune, comunicand cu o parte sau cu ambele, dar A si B comunica direct intre ei - off-line
T nu este implicat in protocol in timp real dar pregateste a priori informatii care sunt disponibile lui A si/sau B care sunt utilizate in protocol
- in-line
- clasificare pentru tert intr-un sistem de certificate cu cheie publica
- autoritate de certificare (CA)
responsabila pentru distributia cheilor publice carora le garanteaza autenticitatea
in sistemele bazate pe certificate, cheile publice sunt legate de nume prin certificate semnate; autoritatea gestioneaza numerele certificatelor si revocarea acestora - server de nume
gestioneaza spatiul de nume - autoritate de inregistrare
autorizeaza entitatile, care sunt identificate prin nume unice, ca membri ai domeniului de securitate - generator de chei
creeaza perechi de chei publice/private
poate fi parte a entitatii, a CA sau un sistem de infcredere independent - director de certificate
gestionar al unei baze de date cu certificate ce este gestionata de CA sau de catre entitati
- autoritate de certificare (CA)
- functii primare
- server de autentificare
realizeaza distributia cheilor intre entitati, inclusiv autentificarea acestora - gestionar de chei
realizeaza stocarea cheilor, informatiilor de auditare, aplicarea cerintelor de ciclu de viata a cheilor
- server de autentificare
- alte functii
- agent de marcare timp
valideaza existenta unui document la un moment de timp sua lipirea unei date calendaristice la o tranzactie sau mesaj digital - notar
verifica o semnatura digitala la un moment dat de timp sau mai general, atesta o depozitie data intr-o anumita jurisdictie la un moment dat de timp
- agent de marcare timp
- comparatie intre tehnicile, cu cheie publica si cele cu cheie simetrica, de gestionare a cheilor
-
avantaje ale tehnicilor cu cheie publica
- gestionare simplificata a cheilor
- nu este necesar un server de incredere on-line
- functiuni suplimentare
- tehnici pentru distribuirea cheilor private si a cheilor secrete
- clasificarea cheilor dupa modul de utilizare
- chei sablon
chei neprotejate criptografic ce sunt distribuite manual sau instalate initial si sunt protejate prin proceduri de control si/sau izolare fizica - chei de criptare a cheilor
sunt chei simterice sau publice ce sunt folosite in protocoalele de transport ale cheilor; pot fi protejate prin alte chei - chei de date
sunt utilizate in operatiile criptografice asupra datelor utilizatorului; in general sunt chei simetrice
- chei sablon
- criptoperioada unei chei
este intervalul de timp in care o cheie este valida pentru folosire de catre partile indreptatite - clasificarea cheilor dupa criteriul temporalitatii
- chei pe termne lung
cheile sablon, deseori cheile de criptare a cheilor, cheile utilizate pentru acordul asupra cheilor - chei pe termen scurt
cheile ce sunt stabilitate prin transport sau acord si deseori cheile de date sau cheile de sesiune
in general comunicatia se face cu chei de termen scurt in timp ce stocarea se face utilizand chei de termen lung
- chei pe termne lung
- KTC si certificate cu cheie simetrica
- protocol translatie mesaj prin KTC
-
- A interactioneaza cu KTC si cu B
- A transfera un mesaj secret, M sau o cheie de sesiune B
-
- E este un algoritm de criptare simetrica
- setare initiala: A si T partajeaza cheia KAT, B si T partajeaza cheia KBT
- mesaje
- A → T: A, EKAT(B, M)
- A ← T: A, EKBT(B, M)
- A → B: A, EKBT(B, M)
- actiuni
- A cripteaza M sub KAT si trimite lui T impreuna cu identificatorul propriu
- T decripteaza M, determina destinatarul, cripteaza M cu cheia destinataruluiu
- T trimite lui A mesajul pe care acesta il va trimite lui B; T poate trimite direct lui B
-
- certificate cu cheie simetrica
pot constitui un mijloc prin care KTC evita necesitatea unei baze de date sigure cu secretele utilizatorilor
cheia fiecarui utilizator este ambalata intr-un certificat, EKT(KBT , B), criptat cu o cheie sablon simetrica, KT, cunoscuta doar lui T astfel ca stocarea sigura este necesaraa doar pentru aceasta cheie
- protocol translatie mesaj prin KTC
- tehnici pentru distribuirea cheilor publice
- obtinerea cheilor publice
- livrarea punct la punct pe un canal de incredere
cheile sunt obtinute direct de la alti utilizatori - accesul direct la un fisier public de incredere
cheile sunt obtinute dintr-o baza de date publica a carei integritate este de incredere; o metoda poate fi autentificarea fisierului public prin autententificarea arborescenta a cheilor publice - utilizarea unui server on-line de incredere
ce asigura accesul la echivalentul unui fisier public ce contine cheile publice autentice; transmisiile cheilor sunt semnate - utilizarea unui server off-line si acertificatelor
entitatea A contacteaza CA pentru a-si inregistra cheia publica si obtine semnatura de verificare; CA certifica cheia publica a lui A legand-o de un sir care-l identifica pe A; partile obtin cheile publice autentice prin schimbarea certificatelor sau direct dintr-un director public - utilizarea unor sisteme care garanteaza implicit autenticitatea parametrilor publici
utilizarea unor algoritmi ce permit ca o modificare a parametrilor publici sa conduca la un insucces, detectabil si necompromitatoar, al tehnicilor criptografice
aceste sisteme includ sistemele bazate pe identitate
- livrarea punct la punct pe un canal de incredere
- certificate cu cheie publica
- certificat cu cheie publica
- o structura de date ce compusa dintr-o parte de date si o parte de semnatura; partea de date contine text in clar, cel putin o cheie publica si un sir de identificare a entitatii. Partea de semnatura contine semnatura digitala, emisa de CA, asupra partii de date.
sirul de identificare a entitatii trebuie sa fie un nume unic in sistem pe care CA il asociaza ueni entiati reale
CA poseda propria pereche semnatura-cheie, ce poate fi facuta disponibila prin mijloace necriptografice- crearea certificateleor
- tertul creeaza perechea de chei
, include identitatea entitaii si cheia publica intr-un certificat; entitatea obtine cheia privata pe un canal sigur (autentic si privat) - entitatea isi creeaza prorpia pereche de chei
si transfera cheia publica tertului pe un canal sigur
- tertul creeaza perechea de chei
- utilizarea si verificarea certificatelor
-
entitatea B utilizeaza un certificat pentru a obtine cheia publica autentica a lui A
- (o singura data) obtine cheia publica autentica a CA
- obtine un sir care identifica in mod unic entitatea A
- obtine un certificat cu cheie publica care corespunde entiatii A si care este in acord cu sirul de identificare
-
- verifica perioada de validitate a certificatului folosind data si ora curente obtinute de la un ceas de incredere
- verifica validitatea cheii publice a CA
- verifica semnatura din certificatul lui A folosind cheia publica a CA
- verifica daca certificatul nu a fost revocat
- daca toate verificarile au succes accepta cheia publica din certificat ca fiind cheia autentica a lui A
- certificate de atribute
sunt similare certificatelor cu chei publice dar au rolul de a permite specificarea altor informatii decat cheile publice
- sisteme bazate pe identitate
- sistem criptografic bazat pe identitate
- Sistem asimetric in care informatia publica de identificare a unei entitati joaca rolul cheii publice si este utilizata de catre tert pentru a calcula cheia privata
- autentificarea in sisteme bazate pe identitate
- Motivatia este de a crea un sistem criptografic care modeleaza un sistem de posta ideal in care numele unei persoane este suficient pentru a trimite mesaje care pot fi citite doar de catre destinatar si care sa permita verificarea unei semnaturi pe care numai aceea persoana o poate emite. In asemenea sisteme:
- utilizatori nu schmiba chei
- nu sunt necesare directoare publice
- serviciile unui tert sunt necesare doar in faza initiala
- chei publice certificate implicit
- caracteristici
- cheile publice ale entitatilor pot fi reconstruite din informatii publice, care astfel inlocuiesc certificate;e
- informatia publica include
- informatii publice asociate tertului
- identitatea entitatii (nume, adresa, etc.)
- informatii publice suplimentare despre entitate
- integritatea unei chei publice reconstruite nu este verificabila direct dar o cheie publica poate fi reconstruita doar din informatiile autentice despre o entitate
- separarea cheilor
-
Informatia care s-ar putea asocia cheilor:
- proprietarul cheii
- perioada de validitate
- identificatorul cheii (referinte noncriptografice)
- utilizarea destinata
- algoritmul
- numele entitatilor asociate generarii cheii, inregistrarii si certificarii
- suma de control a cheii
- tehnici pentru controlul utilizarii cheilor simetrice
- marcaje de chei si variante de chei
Marcajele de cheie asigura o metoda simpla pentru specificarea utilizarilor permise ale cheilor
Marcajul de cheie este un vector de biti sau un camp structurat care acompaniaza cheia pe intreaga sa durata de viata, fiind criptat impreuna cu aceasta-
Tehnici de separare
- derivarea unor chei variante dntr-o cheie de baza utilizand parametri si o functie care nu sunt secrete
- compensarea cheii: o cheie de criptare K este modificata ca o functie de un contor care se incrementeaza la fiecare utilizare
- notarizarea cheilor
este un mecanism pentru distribuirea cheiolor autentificate
este o tehnica destinata prtevenirii substitutiei cheii prin specificarea explicita a identitatilor entitatilor implicate
o cheie este autentificata in functie de identitatile partilor, prin modificarea unei chei de criptareai ai recuperarea cheii protejate se poate face doar specificand corect identitatile; cheia este sigilata cu aceste identitati
notarizarea simpla a cheii: un server de incredere (notar) sau una dintre parti cripteaza cheia de sesiune, S, utilizand cheia de criptare, K, EK ⊕ ( A || B); cheia de sesiune S este destinata uzului entitatilor A si B; entitatea care doreste sa recupereze S trebuie sa partajeze K si sa specifice A si B in ordinea corecta - vectori de control
este o metoda pentru controlul utilizarii cheilor ce combina marcajele de cheie cu mecanismul de notarizare
fiecarei chei S ii este asociat un vector de control C, un camp de date, ce defineste utilizarile autorizate ale cheii; criptarea este EK ⊕ C(S)
decriptarea necesita specificarea corecta a vectorului de control C si cheii de criptare, K
- domeniu de securitate
- Un sistem care este sub controlul unei singure autoritati si in care entitatile din domeniu au incredere
fiecare entitate- partajeaza un secret sau o parola - in cazul simetric
- detine cheia publica autentica a CA- in cazul asimetric
- increderea intre doua domenii
- entitatile A si B apartinand domeniilor DA si DB ce au autoritatile TA si TB doresc sa comunice; A si B fie
- partajeaza o cheie simetrica
- partajeaza chei publice de incredere
A si B delega pe TA si TB prin intermediul canalelor sigure (A , TA) , (TA , TB ) , ( B , TB ) in stabilirea relatiei de incredere ( A , B)
daca TA si TB nu au o relatie de incredre directa, vor face apel la TC in care au ambiele incredere - metode
- cheie simetrica de incredere
- A cere lui TA sa obtina o cheie pe care sa o partajeze cu B
- TA si TB stabilesc o cheie de termen scurt KAB
- TA si TB distribuie KAB lui A si B
- A comunica direct cu B utilizand KAB
- cheie publica de incredere
- A cere lui TA cheia publica a lui B
- TA o obtine de la TB care garanteaza autenticitatea
- TA transfera aceasta cheie lui A
- A comunica direct cu B utilizand KAB
- cheie simetrica de incredere
- certificat incrucisat
un certificat creat de CA1 prin care se certifica cheia publica a CA2
- modele de incredere cu mai multe CA-uri
- Relatiile de incredere intre CA-uri, in sisteme cu cheie publica, pot fi organizate in mai multe moduri
- lanturi de certificate si cai de certificare
o entitate doreste sa obtina o cheie publica autentica, verificand un certicat emis de o alta CA decat CA in care are incredere
calea de certificare este un drum in graful ce contine CA-urile, pentru care nodul initial este CA-ul in care entitatea are incredere si cel final este CA-ul care a emis certificatul pe care entitatea doreste sa-l verificae
un lant de certificate este secventa de certificate emise de CA-urile dintr-o cale de certificare - domenii separate
CA-urile trebuie sa aiba relatii de incredere pentru ca o entitate dintr-un domeniu sa poata comunica criptografic cu o entitate din alt domeniu; implicit CA-urile definesc separate de securitate care nu au relatii de incredere ai entitatile dintr-un domeniu nu pot verifica autenticitatea certificatelor emise in alt domeniu
CA-ul este radacina unui arbore in care entitatile sunt frunze - model de incredere strict ierarhic
CA-urile sunt nodurile neterminale ale unui arbore la care radacina este un CA si entiatile sunt frunze
CA-ul parinte emite certificate pentru CA-urile copil
pot fi organizate in paduri pentru care radacinile arborilor au relatii de incredere - certificate inverse si modelul de incredere bigraf
topologia este aceeasi ca in modelul strict ierarhic dar un CA copil poate emite certificate pentru CA-ul parinte
tipurile de certificate- certificat direct
este certificatul emis de CA parinte pentru CA copil - certificat invers
este certificatul emis de CA copil pentru CA parinte
- certificat direct
- distribuirea si revocarea certificatelor
- distribuirea certificatelor
- modelul extragere
este cel implementat print-un director de certificate, entitatile extragand certificatul de care au nevoie - modelul promovare
toate certificatele sunt trnsmise periodic tututror entitatilor
- modelul extragere
- retragerea certificatelor
- expirarea datei din certificat
- notificare manuala
entitatile sunt informate pe un canal out-of-band asupra cheilor revocate - fisier public cu chei revocate
ce contine cheile revocate si care trebuie consultat de catre entiati inainte de a folosi o cheie - liste de revocare a certificatelor (CRL)
- certificate de revocare
certificate cu cheie publica ce contin un flag si un timp de revocare si care se folosesc pentru anularea certificatului corespondent
Tuesday, January 10, 2006
Protocoale de distribuire a cheilor
- cadrul de lucru
- protocol
- un algoritm ce specifica pasii prin care doua sau mai multe entitati conclucreaza pentru atingerea unui obiectiv
- distribuirea cheilor
- un protocol prin care un secret partajat devine disponibil partilor spre uz criptografic viitor
-
multe dintre protocoalele de distribuire a cheilor implica existenta unei entitati centrale sau a unei entitati de incredere. Aceasta entitate se poate intalni sub diferite denumiri
- trusted third party
- trusted server
- authentication server
- key distribution center (KDC)
- key translation center (KTC)
- certification authority (CA)
- transportul cheilor
- un protocol prin care partile creeaza sau obtin un secret pe care il transfera intr-un mod sigur intre ele
- acordul asupra cheilor
- un protocol prin care partile deduc un secret partajat in baza informatiilor asociate fiecarei parti ai nici una dintre parti nu poate prezice rezultatul
- schema de predistribuire a cheilor
- un caz particular de distribuire a cheilor in care cheile sunt determinate a priori din informatia asociata partilor
- distribuirea dinamica a cheilor
- un caz particular de distribuire a cheilor in care cheile variaza de la o sesiune la alta
- autentificarea cheii
- o entitate se asigura ca nici o alta entitate in afara entitatii/entitatilor identificate nu are acces la o anumita cheie secreta
- confirmarea cheii
- o entitate se asigura ca o alta entitate (posibil neidentificata) este in posesia unei anumite chei secrete
- autentificarea explicita a cheii
- sunt simultan valabile autentificarea cheii si confirmarea cheii
- distribuirea cheii autentificate
- un protocol care asigura autentificarea cheii
- distribuirea cheilor bazata pe identitate
- un protocol de distribuire a cheilor in care informatia de identificare a entitatii se foloseste drept cheie publica
- distribuirea independenta de mesaj a cheilor
- un protocol de distribuire a cheilor in care sunt implicate doar doua entitati si in care mesajele schimbate intre acestea nu depind de informatia de sesiune
- caracteristici ale protocoalelor de distribuire a cheilor
- natura autentificarii
- o combinatie a urmatoarelor
- autentificarea entitatii
- autentificarea cheii
- confirmarea cheii
- reciprocitatea autentificarii
- fiecare dintre autentificarile de mai sus pot fi unilaterale sau mutuale
- prospetimea cheii
- din punctul de vedere al unei entitati o cheie proaspata este o cheie ce nu a mai fost utilizata
- controlul cheii
- o entitate alege o cheie
- cheia este derivata din informatioa asociata partilor si nici o parte nu poate o poate prevedea
- eficienta
- numarul de mesaje schimbate intre parti
- latimea de banda necesara
- complexitatea calculelor
- posibilitatea de a face calcule off-line
- cerinte privitoare la o terta parte
- existenta, on-line sau off-line sau inexistenta unei terte parti
- gradul de incredere cerut unei terte parti
- tipul de certificat utilizat daca este cazul
- maniera de distributie a informatiei initiale
- nonrepudierea
- un protocol trebuie sa asigure o confirmare a primirii cheii
- atac pasiv
- atacul realizat de catre un adversar care inregistreaza traficul si apoi incearca analiza
- atac activ
- atacul realizat de catre un adversar ce modifica sau injecteaza mesaje
- confidentialitate perfecta inainte
- se spune despre un protocol ca are aceasta proprietate daca compromiterea cheilor de lunga durata nu duce la compromiterea cheilor din sesiunile din trecut
- vulnerabil la atac cu cheie cunoscuta
- se spune despre un protocol ca are aceasta proprietate daca compromiterea cheilor de sesiune din trecut permite unui adversar activ sa compromita cheile de sesiune din viitor sau impersonalizarea in viitor realizata de catre un adversar activ
- distribuire prin criptare si tehnici simetrice
- transportul cheilor prin criptare simetrica
- derivarea si transportul cheilor in lipsa unui server
- actualizarea punct-la-punct a cheii prin criptare simetrica
- actualizarea punct-la-punct a cheii prin prin derivarea cheii si functii neinversabile
- transportul cheii fara chei partajate initiale
- Kerberos si protocoale cu server
- protocolul de autentificare Kerberos
-
sunt implicate trei entitati: A(client), B(server si verificator) si T(server de autentificare Kerberos)
initial A si B nu partajeaza nici un secret in timp ce T partajeaza cate un secret cu fiecare
scopul lui B este acela de a verifica identitatea lui A si ca efect colateral, stabilirea unei chei partajate
optional A si B se autentifica reciproc si stabilesc o cheie secreta care nu este cunoscuta de T
A cere lui T referinte care sa-i permita sa se autentifice fata de B
T returneaza lui A o cheie de sesiune criptata pentru A si un tichet criptat pentru B
A transmite lui B tichetul si identitatea lui A
A se autentifica fata de B print-un mesaj, ce contine un marcaj de timp, criptat cu cheia de sesiune -
-
- E este un algoritm de criptare simetrica
- NA este o informatie aleasa de A; TA este un marcaj de timp dedus din ceasul local al lui A
- L este durata de validitate
- A si T partajeaza cheia KAT iar B si T partajeaza cheia KBT; tichetB = EKBT(k, A, L); autentificator = Ek(A, TA, Asubcheie)
-
-
mesaje
- A → T: A, B, NA
- A ← T: tichetB, EKAT(k, NA, L, B)
- A → B: tichetB, autentificator
- A ← B: Ek(TA, Bsubcheie)
-
-
actiunile
- A genereaza informatia NA si trimite lui T mesajul
- T genereaza o cheie de sesiuen k, defineste o perioada de validitate, L, a tichetului (timp de expirare, optional timp de incepere); cripteaza cheia, informatia primita de la A, durata de validitate si identitatea lui B utilizand cheia lui A; T creeaza un tichet criptat cu cheia lui B ce contine cheia,k, identitatea lui A si durata de validitate; ambele sunt transmise lui A
- A decripteaza partea de mesaj ce-i este adresata si recupreaza cheia, k, informatia transmisa initial, NA, durata de validitate, L si identitatea lui B; A verifica ca identitatea lui B si informatia, NA sunt cele transmisie initila lui T si salveaza L; T cripteaza propria identitate, un marcaj de timp si optional un secret, Asubcheie utilizand cheia de sesiune si transmite lui B
- B decripteaza tichetul utilizand cheia, KBT si recupreaza cheia de sesiuen, k pe care o foloseste pentru decriptarea autentificatorului si verifica
- ca identitatea lui A din tichet si din autentificator corespunf
- daca marcajul de timp din autentificator este valid
- daca timpul local propriu este in intervalul specificat prin L
- (optional autentificare mutuala) B cripteaza marcajul de timp al lui A si o subcheie (care sa permita o negociere ulterioara a unei subcehi de sesiune) cu cheia de sesiune, k, si trimite lui A
- A decripteza si recupereaza subcheia lui B, daca marcajul de timp corespunde
-
-
sunt implicate trei entitati: A(client), B(server si verificator) si T(server de autentificare Kerberos)
- protocolul cu chei partajate Needham-Schroeder
- protocolul Otway-Rees
- protocolul de autentificare Kerberos
- acordul asupra cheilor prin tehnici simetrice
- sistem de distribuire chei (KDS - key distribution system) este o metoda prin care, in timpul unei perioade de initializare, un server de incredere genereaza si distribuie date secrete utilizatorilor ai orice pereche de utilizatori poate sa calculeze o cheie partajata, necunoscuta altor utilizatori, exceptie facand serverul
pentru o pereche de chei fixate, KDS este o scheme de predistributie - KDS j-sigur pentru o pereche de utilizatori, orice coalitie de j sau mai putin utilizatori ce partajeaza datele proprii nu pot calcula cheia partajata de perechea initiala mai bine decat simpla ghicire
- limita Blom pentru KDS intr-un KDS j-sigur ce asigura perechi de chei pe m biti, datele secrete stocate de catre fiecare utilizator trebuie sa aiba cel putin m(j+1) biti
- sistemul simetric Blom de predistribuire a cheii
- distribuire prin criptare si tehnici asimetrice
- transportul cheilor prin criptare cu cheie publica
- protocoale fara semnaturi
- Needham-Schroeder cu cheie publica
- protocoale cu semnaturi
- criptarea cheilor semnate
- criptare si semnare separat
- semnarea cheilor criptate
- protocoale de autentificare X.509
- este in categoria protocoalelor cu semneaza cheile criptate; recomandarea defineste protocoale de autentificare "strong two-way" si "strong three-way" (cu doua si trei treceri) cu autentificarea mutuala a entitatilor si transportul optional al cheilor, cu marcaje de timp si intrebare-raspuns ai sa raspunda urmatoarelor cerinte:
- inf. criptografice primite de entitatea B au fost construite de catre entitatea A, care nu le poate altera ulterior
- inf. criptografice primite de entitatea B sunt destinate lui B
- inf. criptografice primite de entitatea B sunt proaspete
- secretul mutual al cheilor transferate
- protocol cu doua treceri
-
A trimite lui B un mesaj si B raspunde cu un mesaj
- Notatie
- PA(x) este rezultatul aplicarii cheii publice a lui A la datele x
- SA(x) este rezultatul aplicarii cheii private de semnare a lui A la datele x
- rA si rB sunt numere ce nu se refolosesc
- certA este un certificat ce asociaza entitatea A la o cheie publica adecvata atat pentru criptare cat si pentru verificarea semnaturii
- initializarea sistemului
- fiecare entitate are propria pereche de chei pentru criptare si semnare
- entitatea A trebuie sa obtina si sa autentifice cheia publica de criptare a lui B
- mesajele protocolului
fie DA = (tA, rA, B, date1, PB(k1)) si DB = (tb, rB, A, rA, date2, PA(k2))- A → B: certA, DA, SA(DA)
- A ← B: certB, DB, SB(DB)
- actiunile
- A obtine marcajul de timp tA care indica timpul de expirare, genereaza rA si optional cheia simetrica k1; date1 sunt date optionale pentru care se doreste autentificarea originii
- B verifica autenticitatea lui certA, extrage cheia publica de semnare a lui A si verifica semnatura lui A pe blocul DA; B verifica ca el este destinatarul mesajului, ca marcajul de timp este valid si ca rA nu a fost inlocuit (rA contime o secventa pe care B o compara cu o informatie de stare locala in ceea ce priveste unicitatea pentru intervalul de validitate definit prin tA)
- daca verificarile au succes B dautentifica pe A, decripteaza k1 utilizand propria cheie privata si o salveaza; A este autentificat
daca se doreste autentificare mutuala, B obtine tB, genereaza rB si trimite lui A un mesaj similar - A parcurge aceeasi secventa de actiuni; A si B sunt mutual autentificate; A si B partajeaza sceretele mutual k1 si k2
se foloseste aceeasi pereche de chei pentru semnare si criptare; deoarece nu se folosesc identificatori, DA = DA (... PB(...) ...) nu exista garantia ca entitatatea care semneaza, SA(DA) este sursa
in caz de reusita, ambele entitati sunt mutual autentificate si se face transportul cheilor autentificate - Notatie
- protocol cu trei treceri
-
A si B schimba 3 mesaje; protocolul difera de cel anterior dupa cum urmeaza:
- marcajele de timp tA si tB sunt setate la zero si nu se verifica
- A verifica ca rA este acelasi ca in primul mesaj
- A trimite un al treilea mesaj catre B
A → B: (rB, B), SA(rB, B) - B verifica semnatura cu mesajul in clar, corectitudinea identitatii B si ca rB este acelasi cu cel initial
- este in categoria protocoalelor cu semneaza cheile criptate; recomandarea defineste protocoale de autentificare "strong two-way" si "strong three-way" (cu doua si trei treceri) cu autentificarea mutuala a entitatilor si transportul optional al cheilor, cu marcaje de timp si intrebare-raspuns ai sa raspunda urmatoarelor cerinte:
- protocoale hibride
-
aceste protocoale aplica o criptare simetrica peste criptarea cu cheie publica si peste semnatura
- protocolul Beller-Yacobi
asigura autentificarea mutuala a entitatilor si autentificarea explicita a cheii
a fost prioectat pentru aplicatiile in care exista un dezchilibru intre puterile de calcul ale celor doua parti pentru a minimiza cerintele de putere de calcul ale partii mai slabe; identitatea partii mai slabe ramane ascunsa adversarului
fie A entitatea mai slaba si B entitatea mai puternica; A se autentifica lui B prim semnarea unei intraberi in timp ce B se autentifica lui A demonstrand cunoasterea unei chei pe care numai B insusi o poate recupera
- protocolul Beller-Yacobi
- acordul asupra cheilor prin tehnici asimetrice
- Diffie-Helllman si protocoale inrudite
- acordul Diffie-Hellman asupra cheilor
a fost prima solutie practica la problema distributiei cheilor care a permis celor doua parti sa partajeze un secret fara a cunoaste a priori o alta informatie, pe un canal deschis-
A si B trimit cate un mesaj peste un canal deschis, la final A si B partajeaza secretul K
- pas premergator, o singura data
se selecteaza un numar prim p si un generator α al lui Zp* si se publica - mesaje
- A → B: αx mod p
- A ← B: αy mod p
- actiuni
- A selecteaza aleator un secret x, 1 ≦ x ≦ p-2 si trimite lui B
- B selecteaza aleator un secret x, 1 ≦ x ≦ p-2 si trimite lui A
- B calculeaza K = (αx)y mod p
- A calculeaza K = (αy)x mod p
- pas premergator, o singura data
- acordul ElGamal intr-o singura trecere
- protocoale MTI cu doua treceri
- protocolul STS (Station-to-Station)
- acordul Diffie-Hellman asupra cheilor
- Chei publice certificate implicit
- Gunther
- Girault
- Protocoale Diffie-Hellman cu chei certificate implicit
Friday, January 06, 2006
Algoritmi semnatura digitala
- scheme cu anexa
-
algoritmul de verificare primeste ca intrare mesajul
- algoritmi generali
- generarea cheii
-
fiecare entitate creeaza o cheie privata pentru semnarea mesajelor si o cheie publica pentru verificare
- o entitatea A selecteaza o cheie privata ce defineste o multime a transformarilor de semnare SA = {SA,k/ k ∈ I} unde fiecare SA,k este o functie injectiva de la Ps la S
- SA defineste o transformare de verificare VA :Psx S → {adevarat, fals} ai
adevarat daca SA,k(p) = s* VA(p, s*) = fals altfel
VA poate fi calculata fara a cunoaste semnatura privata a emitentului - cheia publica a lui A este VA si cheia privata este multimea SA
- semnarea/verificarea
-
o entitatea A produce o semnatura s ∈ S pentru un mesaj p ∈ P ce mai tarziu poate fi verificata de o alta entitate B
- semnarea
-
entitatea A executa
- selecteaza un element k ∈ I
- calculeaza p = h(p) si s* = SA,k(p)
- semnatura lui A pentru p este s*; atat p cat si s* sunt puse la dispozitia entitatilor care doresc sa verifice semnatura
- verificarea
-
entitatea B executa
- obtine cheia publica autentica, VA a lui A
- calculeaza p = h(p) si v = VA(p, s*)
- accepta semnatura daca si numai daca v = adevarat
- semnarea
- ElGamal
- DSA
- este o varianta a semnaturii ElGamal
- generarea cheilor
- selecteaza un numar prim q ai 2159 < q < 2160
- alege t ai 0 ≦ t ≦ 8 si un numar prim p, 2511+64t < p < 2511+64t cu proprietatea q|(p-1)
- selecteaza un generator α al grupului ciclic de ord q din Zp*
- selecteaza un element g ∈ Zp* si calculeaza α = g(p-1)/q mod p
- daca α = 1 at reia de la pasul anterior
- selecteaza aleator un intreg a ai 1 ≦ a ≦ q-1
- calculeaza y = αa mod p
- cheia publica a lui A este (p, q, α, y) si cheia privata este a
- semnarea/verificarea
- semnarea
-
entitatea A semneaza un mesaj, p, de lungime arbitrara
- selecteaza aleator un intreg k, 0 < k < q, k va ramane secret
- calculeaza r = (αk mod p) mod q
- calculeaza k-1 mod q
- calculeaza s = (k-1(h(p)+ar)) mod q
- semnatura lui A este (r, s)
- verificarea
-
entitatea B verifica semnatura lui A, (r, s) pentru mesajul p
- obtine cheia publica autentica a lui A, (p, q, α, y)
- verifica ca 0 < r < q si 0 < s < q, altfel respinge semnatura
- calculeaza w = s-1 mod q si h(p)
- calculeaza u1 = (wh(m)) mod q si u2 = (rw) mod q
- calculeaza v = ( (au1 yu2) ) mod q
- accepta semnatura daca v = r
- semnarea
- PKCS#1
- aceasta schema nu utilizeaza caracteristica de recuperare a mesajului a schemei RSA si foloseste o functie de dispersie (MD-2 sau MD-5)
- Schnorr
- Feige-Fiat-Shamir
- scheme cu recuperarea mesajului
-
algoritmul de verificare nu necesita mesajul
- algoritmi generali
- generarea cheii
-
fiecare entitate creeaza o cheie privata pentru semnarea mesajelor si o cheie publica pentru verificare
- o entitatea A selecteaza o cheie privata ce defineste o multime a transformarilor de semnare SA = {SA,k/ k ∈ I} unde fiecare SA,k este o functie injectiva de la Ps la S
- SA defineste o transformare de verificare VA :S → Ps ai
∀ p ∈ Ps, ∀ k ∈ I, VA º SA,k = 1Ps
VA poate fi calculata fara a cunoaste semnatura privata a emitentului - cheia publica a lui A este VA si cheia privata este multimea SA
- semnarea/verificarea
-
o entitatea A produce o semnatura s ∈ S pentru un mesaj p ∈ P ce mai tarziu poate fi verificata de o alta entitate B; mesajul p este recuperat din s
- semnarea
-
entitatea A executa
- selecteaza un element k ∈ I
- calculeaza p = r(p) si s* = SA,k(p)
- semnatura lui A este s*; s* este pus la dispozitia entitatilor care doresc sa verifice semnatura
- verificarea
-
entitatea B executa
- obtine cheia publica autentica, VA a lui A
- calculeaza p = VA(s*)
- verifica ca p ∈ Pr si in acest caz accepta semnatura
- recupereaza mesajul p din p calculand r-1(p)
- semnarea
- RSA
- atat spatiul de semnare Ps cat si spatiul semnaturilor S sunt reprezentate de Zn
- generarea cheilor
-
fiecare entitate creeaza o cheie publica RSA si o cheie privata corespondenta; o entitate A executa
- genereaza doua numere prime distincte, p si q, de acceasi marime
- calculeaza n = pq si φ = (p-1)(q-1)
- selecteaza aleator in intreg e, 1 < e < φ ai cmmdc(e, φ) = 1
- calculeaza intregul (Euclid extins) d, 1 < d < φ ai ed ≡ 1 mod φ
- cheia publica a lui A este (n, e) si cheia privata este d
- semnarea/verificarea
-
entitatea A semneaza un mesaj p ∈ P si oricare alta entitate B poate verifica smenatura lui A si recupera mesajul p din semnatura
- semnarea
-
o entitate A executa
- calculeaza p = r(p) ca un intreg in intervalul [0, n-1]
- calculeaza s = pd mod n
- semnatura lui A pentru p este s
- verificarea
-
o alta entitate B executa
- obtine cheia publica autentica a lui A, (n, e)
- calculeaza p = se mod n
- verifica ca p ∈ Pr si daca nu rejecteaza semnatura
- recupereaza mesajul p = r-1(p)
- semnarea
- Rabin
- Nyberg-Rueppel
-
majoritatea schemelor cu recuperarea mesajului sunt aplicate mesajelor de lungime fixa, in timp ce schemele cu anexa se aplica mesajelor de lungimi variabile