2014-09-19 35 views
6

Mam kilka bibliotek, C#, PHP i Androida, gdzie wszystkie one szyfrują/odszyfrowują ciąg znaków w ten sam sposób, więc wszystkie są ze sobą kompatybilne, tj. C# zapisuje i szyfruje dane do bazy danych i PHP może ją odszyfrować i zwrócić oryginalny ciąg znaków.AES-256 i PKCS7Padding nie powiedzie się w Javie

Teraz muszę zrobić to samo ze standardową aplikacją Java, więc wziąłem kod z mojej biblioteki Androida i potrzebowałem bibliotek, ale dostaję wyjątek. O ile mi wiadomo, kod nie był specyficzny dla Androida, więc nie powinien stanowić problemu.

Poniżej jest moja funkcja szyfrowania

public static String encrypt(String plainPasword) 
    { 
      String password = ""; 
      try 
      { 
       SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES"); 
       IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII")); 

       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

       cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

       byte[] encoded = cipher.doFinal(plainPasword.getBytes()); 
       password = new String(Base64.encodeBase64(encoded)); 

      } 
      catch (Exception ex) 
      { 
       System.err.println("Encryption Exception: " + ex.toString()); 
      } 
      return password; 
    } 

Kiedy zadzwonić Encryption.encrypt("myString"); pojawia się następujący wyjątek:

Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding 

Jak powiedziałem ten kod działa poprawnie na Androida i nie należy dokonywać żadnych różnica, z której pochodzi.

Dziękujemy za pomoc.

UPDATE

znalazłem, że muszę PKCS5Padding zamiast 7, dzięki link na komentarz. Jestem teraz chociaż otrzymuję następujący wyjątek:

Encryption Exception: java.security.InvalidKeyException: Illegal key size 
+1

http://stackoverflow.com/questions/10193567/java-security-nosuchalgorithmexception-cannot-find-any-provider-supporting-eses – srkavin

+0

Dzięki, gdy googlowałem, nic nie znalazłem, chociaż zmieniłem zdanie teraz mówi mi, że klucz jest nieprawidłowy rozmiar – Boardy

+0

Będziesz potrzebować plików strategii JCE o nieograniczonej sile. http://deveshsharma.info/2012/10/09/fixing-java-security-invalidkeyexception-ilegal-key-size-exception/ – srkavin

Odpowiedz

16

Po pierwsze, w Javie, a średnia nazwa wyściółka jest PKCS5Padding nie PKCS7Padding. Java faktycznie wykonuje wypełnianie PKCS # 7, ale w specyfikacji JCA, PKCS5Padding to nazwa podana.

Następnie próbujesz użyć AES-256, więc musisz zainstalować pliki zasad Unlimited Strength Jurisdiction.

Mam nadzieję, że to tylko przykład i nie używasz tego samego IV dla każdej wiadomości, prawda?

+0

To tylko przykład, skopiowałem zasady, ale nadal otrzymuję to samo z wyjątkiem – Boardy

+0

Prawdopodobnie masz złą wersję lub umieszczasz je w niewłaściwym miejscu. Musisz podać więcej szczegółów lub dokładnie sprawdzić, co zrobiłeś. – erickson

+1

Znalazłem problem. Skopiowałem pliki do programu Files Files \ Java \ jre \ ..., ale używałem jre dołączonego do katalogu JDK. Skopiowałem pliki do tego i wszystkie teraz działają. Dzięki za pomoc. To trochę dziwne dla mnie, dlaczego Android nie ma żadnego z tych problemów, szczególnie, że korzystam z tej samej biblioteki – Boardy