Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Witam,

Może ktoś zna jakiś tutorial \ przykład kodu prezentujący szyfrowanie, deszyfrowanie przy użyciu algorytmu AES ale z własnym zdefiniowanym kluczem.

Przeglądałem przykłady z sieci ale nie znalazłem żadnego "edukującego" przykładu.
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Może doprecyzuję , mam taką sytuację, poprzez sieć pobieram dane które następnie muszę odszyfrować (szyfrowane AES-em).

Klucz którym dane zostały zaszyfrowane jest mi znany - klucz 32 bitowy zapisany hex'em przykładowo fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11fa11.

Teraz mam metodę:

public byte[] encryptMsg(byte[] msg) {
//klucz zapisany jako tablica typu byte zawierająca 32 elementy
byte[] raw = new byte[] { (byte) 0xfa, (byte)0x11 // i tak 16 razy...
};
SecretKeySpec skeySpec = new SecretKeySpec(raw,"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(msg.getBytes());
return decrypted;
}


Dostaję wyjątek:

2012-01-21 22:37:57 javaapplication5.NewMain main
SEVERE: null
java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javaapplication5.Encrypter.encrypt(Encrypter.java:41)
at javaapplication5.NewMain.main(NewMain.java:24)


Będę wdzięczny za wszelką pomoc, jest to część pracy inż, w której szyfrowanie jest kwestią zupełnie poboczną, logikę aplikacji mam już napisaną natomiast nie mogę sobie poradzić z w\w kwestią.

Z góry dziękuję za wszelką pomocJarek Danik edytował(a) ten post dnia 21.01.12 o godzinie 22:39

konto usunięte

Temat: Przykład szyfrowania AES z wlasnym kluczem

Wkleiłeś tylko komunikat wyjątku. Możliwe, że masz dostępne w swojej JDK/JRE jedynie "strong" cryptography, które obsługuje klucze do 128 bitów. Aby mieć dostęp do 192 i 256 bitowych kluczy, musisz mieć zainstalowane "unlimited" cryptography.

Jeśli to ten problem, to szyfrowanie ze 128 bitowym kluczem powinno się powieść. Sprawdź to. Jeśli się uda to przeczytaj to co poniżej i zainstaluj sobie "unlimited" cryptography.

Ze strony SUN/Oracle:

Strong Versus Unlimited Strength Cryptography

Due to import-control restrictions imposed by some countries, the jurisdiction policy files shipped with the Java 2 SDK, v 1.4 only permit strong cryptography to be used. An unlimited strength version of these files (that is, with no restrictions on cryptographic strength) is available for download, however.

After installing the unlimited strength version, to use key sizes of 192 and 256 bits, simply provide the required length of the key. The following line of code illustrates how to set the key size to 256 bits:

kgen.init(256); // 128 and 192 bits also available

The JCE examples given here show how to use AES for different key sizes, but they don't touch upon the more intricate issues -- like key management or key exchange algorithms. In practice, you may be more likely to use a protocol like Secure Socket Layer (SSL), which negotiates session keys using public keys that are subsequently used for bulk encryption.

Pobrać możesz stąd: http://www.oracle.com/technetwork/java/javase/tech/ind...

Rafał
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Pobrałem JCE ale niestety efekt jest dalej taki sam, wydaje mi się iż źle inicjuję klucz.

Jeśli dobrze zrozumiałem dokumentację KeyGenerator służy do wygenerowania nowego klucza ?

pozdrawiam wciąż licząc na pomoc :(

konto usunięte

Temat: Przykład szyfrowania AES z wlasnym kluczem

Dobrze, już widzę, gdzie się pomyliłeś.

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

Skoro szyfrujesz, to powinno byc:

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

Rafał
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Niestety, to tylko literówka przy przeklepywaniu :( w kodzie mam ok, natomiast faktycznie problem polega jednak na braku zainstalowanego "unlimited crypto".

Dla testów czasowo odstąpiłem od próby szyfrowania \ deszyfrowania własnym kluczem i kozystam z KeyGenerator.

Jednak po instalacji jce w wersji 1.2.2 zgodnie z załączoną instrukcja dostaję błąd:


java.security.NoSuchAlgorithmException: AES KeyGenerator not available


po zmianie (wygooglowane):

KeyGenerator kgen = KeyGenerator.getInstance("AES");


na


KeyGenerator kgen = KeyGenerator.getInstance("AES","SunJCE");


dostaję:


java.security.NoSuchAlgorithmException: no such algorithm: AES for provider SunJCE


czyli nie wiem jak uaktywnić 256 klucz dla AES

Może ktoś zna jakąś inną bibliotekę do szyfrowania\deszyfrowania z wykorzystaniem AES ???Jarek Danik edytował(a) ten post dnia 22.01.12 o godzinie 00:18

konto usunięte

Temat: Przykład szyfrowania AES z wlasnym kluczem

Jarek,

Wszystkim działa tylko Tobie nie ? Coś zrobiłeś źle przy instalacji JCE. Pokombinuj. Poszukaj na Stackoverflow itd.

Rafał
Tomasz D

Tomasz D Programista
Java/JEE, freelancer

Temat: Przykład szyfrowania AES z wlasnym kluczem

Popatrz na mój komentarz do klasy:

https://github.com/softwaremill/softwaremill-common/blo...

Z tego co pamiętam to dodałem go właśnie z powodu takiego samego lub podobnego problemu z odpaleniem testów do tej klasy :)
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Tomek, tego mi było trzeba - zwięzłego i jasnego kawałka kodu dzięki któremu zrozumiałem to co zrozumieć miałem :).

Jarek, miałeś rację od początku, faktycznie rozwiązaniem problemu była instalacja "Strong Versus Unlimited Strength Cryptography"

dzięki wielkie za pomoc, na koniec ostatnie pytanie, jeśli dobrze rozumiem to aby aplikacja działała poprawnie to na stacjach użytkowników również należy zainstalować "Strong Versus Unlimited Strength Cryptography" ??
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Panowie, ostatnie pytanie (wszelkie dane w postaci hex):

Mam ustalony klucz:

16253112AFFFA2561235611001120310414142430AABBCCAABBAAFF001123641


Otrzymuję zakodowaną wiadomość w postaci:

C1ECD03C6EDA1C324872B35E7B7F9067


co przy pomocy przykładowo: http://www.unsw.adfa.edu.au/~lpb/src/AEScalc/AEScalc.html

deszyfruję bez problemu do postaci:

110c0100000000000000000000000000


Natomiast próbując zdekodować przy pomocy mojego kodu dostaję wyjątek:

javax.crypto.BadPaddingException: Given final block not properly padded


Idąc od końca, jeśli zaszyfruję docelową wiadomość przy pomocy mojego kodu, zaszyfrowana postać jest dwa razy dłuższa, mianowicie:

C1ECD03C6EDA1C324872B35E7B7F90674472E733C5FC4A5208D627656DCFCF71


i jako taka bez problemu deszyfruje się przy pomocy mojego kodu do poprawnej postaci:

110c0100000000000000000000000000


Z tego co się doczytałem to rozmiar zaszyfrowanej informacji wynosi: = (wiadomosc/16 + 1) * 16 więc wydaje się iż kod dziala poprawnie ale w takim razie w jaki sposób aplet z w\w strony dekoduje informację bez ostatnich 16 znaków ????

Jak zawsze wdzięczny będę za każdą pomoc

Serdecznie pozdrawiamJarek Danik edytował(a) ten post dnia 22.01.12 o godzinie 22:00
Daniel Jabłoński

Daniel Jabłoński developer |
administrator

Temat: Przykład szyfrowania AES z wlasnym kluczem

Akurat wpadł mi w ręce projekt również związany z AES-em więc może pomogę.

Jeśli chodzi o rozmiar wynikowych, zaszyfrowanych danych to najprawdopodobniej interesuje cię tryb ECB:


ECB - This is the electronic cookbook mode. ECB is the simplest of all modes; it takes a simple block of data (8 bytes in the SunJCE implementation, which is standard) and encrypts the entire block at once. No attempt is made to hide patterns in the data, and the blocks may be rearranged without affecting decryption (though the resulting plaintext will be out of order). Because of these limitations, ECB is recommended only for binary data; text or other data with patterns in it is not well-suited for this mode.

ECB mode can only operate on full blocks of data, so it is generally used with a padding scheme.

ECB mode does not require an initialization vector.



Zamień w kodzie wywołania pobierające instancję "cipher'a" z

Cipher cipher = Cipher.getInstance("AES");

na

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");


a zaszyfrowana wiadomość będzie miała ten sam rozmiar co oryginalna, tak jak napisano powyżej ten tryb wskazany jest dla danych binarny

Mam nadzieję że pomogłem, napisałem szybko test u siebie korzystając z danych przez ciebie zamieszczonych i wszystko "bangla".

pozdrawiam
Jarek Danik

Jarek Danik developer, Visionart

Temat: Przykład szyfrowania AES z wlasnym kluczem

Wielkie dzięki, dokładnie o to mi chodziło, temat uważam za zamknięty.

pozdrawiam serdecznie

konto usunięte

Temat: Przykład szyfrowania AES z wlasnym kluczem

Tomek,

Spojrzałem na ten kod i co widzę:


catch (Exception e) {
throw new RuntimeException(e);
}


Rzucanie "surowego" RuntimeException ? Oj niedobrze... :)



Wyślij zaproszenie do