Java

JAVA - AES wybór instancji szyfrowania (Cipher.doFinal()).

Dodano: 2009-05-27
Szyfrując dane w Javie używając metody symetrycznej AES należy zwrócić uwagę na instancje tworzonego obietku klasy Cipher ( Cipher.getInstance(""); ). Instanacja może się składać z nazwy sposobu szyfrowania np.: AES (domyślnie mode, padding) oraz z trzech parametrów postaci nameCrypto/mode/padding.

W zależności od prowajdera, którego używamy implementacji szyfrowania, należy używać parametry mode oraz padding podane przez konkretnego producenta kodu.

Sposób wybranej instancji przez programistę ma bardzo duży wpływ na dalsze kodowanie szyfrowania. Poniżej rozpatrzę dwa przypadki:
  • AES – jeżeli użyjesz tej instancji to korzystając z medody doFinal(), możesz podać parametry ''domknięcia'' tablicy binarnej do wielkości typowej dla metody AES 16 bitów.
    // key - klucz potrzebny do zaszyfrowania
    // inByteArray - tablica bajtowa n–długości

    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    outByteArray = cipher.doFinal(inByteArray, 0, n);


  • AES/CBC/NoPadding – ten parametr instancji wymusza; na programiście podanie parametru przestrzeni używanej przez algorytm AES. Jeżeli nie wykona się tej operacji, to na tekście o długości 16*n bajtów po wykonaniu szyfrowania otrzymasz zaszyfrowany tekst, niestety odszyfrowanie go tą samą metodą się nie powiedzie (czyli zonk ;–).
    Podanie natomiast przestrzeni równej 16 bajtów przy tworzeniu sposobu szyfrowania AES/CBC/NoPadding sprawia, że obiekt klasy Cipher będzie oczekiwał tablicy inByteArray w metodzie Cipher.doFinal o długości dokładnie 16*n bajtów.
    // key - klucz potrzebny do zaszyfrowania
    // inByteArray - tablica bajtowa 16*n–długości
    // passByteArray - tablica bajtowa hasła

    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    byte[] ivPS = new byte[16];
    System.arraycopy(passByteArray, 0, ivPS, 0, 16);
    AlgorithmParameterSpec aPS = new IvParameterSpec(ivPS);
    cipher.init(Cipher.ENCRYPT_MODE, key, aPS);
    outByteArray = cipher.doFinal(inByteArray, 0, 16);
    // lub outByteArray = cipher.doFinal(inByteArray);


źródła:
Praktyka ;-)
http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html
http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html

Valid XHTML 1.0 Transitional