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");
}
}
}

Comments:
invatat o multime
 
Mii de multumiri.
M-ai ajutat enorm cu partea de padding.
 
Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?