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 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
Rafał
Głowiński
Technical Team
Leader / Bravura
Solutions
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 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 :(
Rafał
Głowiński
Technical Team
Leader / Bravura
Solutions
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 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
Rafał
Głowiński
Technical Team
Leader / Bravura
Solutions
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
Dziurko
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 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 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
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 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
Rafał
Głowiński
Technical Team
Leader / Bravura
Solutions
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... :)
