Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Šifrování v Javě pomocí algoritmu AES 256

V tomhle článku si ukážeme jak si napsat vlastní třídu na šifrování a dešifrování AES256.

Ze všeho nejdřív je potřeba si stáhnou upravenou verzi JCE (Java Cryptography Extension), která řeší problém s chybou vadného klíče. Stáhnou můžete zde: http://www.oracle.com/…-432124.html

Přepíšete jen stávající soubory ve složce jdk\jre\lib\s­ecurity

Jako další krok si vytvoříme třídu AESEncrypter a hned si definujeme pár základních proměnný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 - pole s náhodnými bity, které slouží jako doplňující vstup. Je to z toho důvodu, aby výstup měl více možných variant (SALT je vhodné někam ukládat, protože když budete něco chtít dešifrovat, tak se vám vygeneruje jiný SALT, než když jste to šifrovali, nebo taky používat stále ten jeden stejný, ale to není nějak moc bezpečné)
  • ITERATION_COUNT - počet kolikrát se nám klíč mění v metodě
  • KEY_LENGHT - jak dlouhý je klíč, v našem případě se jedná o AES256, takže 256 bitů

Dále bude následovat konstruktor, do kterého budeme volat námi zadaný klíč a inicializujeme zbytek proměnný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 sloužit jako továrna na vytvoření klíče. Parametrem je název algoritmu kterým se to bude šifrovat. Více typů najdete zde http://docs.oracle.com/…rdNames.html#…
  • KeySpec - vytvoří nám jakýsi předpis pro náš klíč, specifikaci, kde zkombinujeme námi zadaný klíč, salt, počet proměn a finální délku
  • SecretKey tmp - pomocí továrny a specifikace klíče se nám vytvoří klíč pomocí defaultních algoritmů
  • SecretKey secret - vezme se defaultní zakódování a vytvoří se klíč pro AES

Dále se získává instance Ciphrů pomocí zadané transformace ve tvaru jméno algoritmu/režim algoritmu/postup algoritmu. Všechny druhy můžete najít opět zde http://docs.oracle.com/…rdNames.html#…

U dešifrátoru se navíc inicializuje iv což je Initialization vector jehož popis najdete např. zde http://en.wikipedia.org/…ation_vector

Metody na dešifraci a šifraci jsou naprosto jednoduché, volají jen metodu Cipheru doFinal() kde parametrem je pole bytů. Při převodu String na pole bytů je vhodné používat třídu 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);
   }

Celou třídu i s ukázkou najdete v archivu pod článkem. Můžeme ji otestovat následujícím způsobem:

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

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 432x (1.18 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Všechny články v sekci
Zdrojákoviště Java - Objektově orientované programování
Článek pro vás napsal Fugiczek
Avatar
Uživatelské hodnocení:
2 hlasů
Aktivity