Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Šifrovanie v Jave pomocou algoritmu AES 256

V tomto článku si ukážeme ako si napísať vlastnú triedu na šifrovanie a dešifrovanie AES256.

Zo všetkého najskôr je potrebné si stiahnu upravenú verziu JCE (Java Cryptography Extension), ktorá rieši problém s chybou chybného kľúča. Stiahnu môžete tu: http://www.oracle.com/...-432124.html

Prepíšete len existujúce súbory v priečinku jdk \ jre \ lib \ security

Ako ďalší krok si vytvoríme triedu AESEncrypter a hneď si definujeme pár základných premenných.

private static final byte[] SALT;
private static final int ITERATION_COUNT;
private static final int KEY_LENGTH;

static{
    SecureRandom secureRandom = new SecureRandom();
    SALT = secureRandom.generateSeed(8);
    ITERATION_COUNT = 65536;
    KEY_LENGTH = 256;
}

private Cipher ecipher; //šifrování
private Cipher dcipher; //dešifrování
  • SALT - polia s náhodnými bitmi, ktoré slúžia ako doplňujúce vstup. Je to z toho dôvodu, aby výstup mal viac možných variantov (SALT je vhodné niekam ukladať, pretože keď budete niečo chcieť dešifrovať, tak sa vám vygeneruje iný SALT, ako keď ste to šifrovali, alebo taky používať stále ten jeden rovnaký, ale to nie je nejako moc bezpečné)
  • ITERATION_COUNT - počet koľkokrát sa nám kľúč mení v metóde
  • KEY_LENGHT - ako dlhý je kľúč, v našom prípade sa jedná o AES256, takže 256 bitov

Ďalej bude nasledovať konštruktor, do ktorého budeme volať nami zadaný kľúč a inicializujeme zvyšok premenných.

public AESEncrypter(String passPhrase) throws Exception {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), SALT, ITERATION_COUNT, KEY_LENGTH);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

        ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        ecipher.init(Cipher.ENCRYPT_MODE, secret);

        dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] iv = ecipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
        dcipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
    }
  • SecretKeyFactory - bude slúžiť ako továreň na vytvorenie kľúča. Parametrom je názov algoritmu ktorým sa to bude šifrovať. Ďalšie modely nájdete tu http://docs.oracle.com/...rdNames.html...
  • KeySpec - vytvorí nám akýsi predpis pre náš kľúč, špecifikáciu, kde skombinujeme nami zadaný kľúč, salt, počet premien a finálne dĺžku
  • SecretKey tmp - pomocou továrne a špecifikácie kľúča sa nám vytvorí kľúč pomocou defaultných algoritmov
  • SecretKey secret - vezme sa defaultný zakódovanie a vytvorí sa kľúč pre AES

Ďalej sa získava inštancie Ciphrů pomocou zadanej transformácie v tvare meno algoritmu / režim algoritmu / postup algoritmu. Všetky druhy môžete nájsť opäť tu http://docs.oracle.com/...rdNames.html...

U dešifrátoru sa navyše inicializuje iv čo je Initialization Vector ktorého popis nájdete napr. Tu http://en.wikipedia.org/...ation_vector

Metódy na dešifraci a šifraci sú úplne jednoduché, volajú len metódu Cipher u doFinal () kde parametrom je pole bytov. Pri prevode String na pole bytov je vhodné používať triedu BASE64Decoder a BASE64Encoder.

public String encrypt(String encrypt) throws Exception {
       byte[] bytes = encrypt.getBytes("UTF8");
       byte[] encrypted = encrypt(bytes);
       return new BASE64Encoder().encode(encrypted);
   }

   public byte[] encrypt(byte[] plain) throws Exception {
       return ecipher.doFinal(plain);
   }

   public String decrypt(String encrypt) throws Exception {
       byte[] bytes = new BASE64Decoder().decodeBuffer(encrypt);
       byte[] decrypted = decrypt(bytes);
       return new String(decrypted, "UTF8");
   }

   public byte[] decrypt(byte[] encrypt) throws Exception {
       return dcipher.doFinal(encrypt);
   }

Celú triedu is ukážkou nájdete v archíve pod článkom. Môžeme ju otestovať nasledujúcim spôsobom:

try {
     AESEncrypter e = new AESEncrypter("e8ffc7e56311679f12b6fc91aa77a5eb");
     byte[]test = e.encrypt(new byte[]{'a','h','o','j'});
     System.out.println(Arrays.toString(test));
     System.out.println(Arrays.toString(e.decrypt(test)));
     //vypisuje hodnoty pismen v ASCII
 } catch (Exception e1) {
     e1.printStackTrace();
 }

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 435x (1.18 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Java - Pre pokročilých
Článok pre vás napísal Fugiczek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity