2014-09-19 29 views
6

Tôi có một vài thư viện, C#, PHP và Android, tất cả đều mã hóa/giải mã chuỗi theo cùng một cách để chúng tương thích với nhau, nghĩa là C# ghi và mã hóa dữ liệu vào một cơ sở dữ liệu và PHP có thể giải mã thành công nó và trả về chuỗi gốc.AES-256 và PKCS7Padding không thành công trong Java

Tôi bây giờ cần phải làm điều tương tự với một ứng dụng Java chuẩn, vì vậy tôi đã lấy mã từ thư viện Android của tôi và cần thư viện nhưng tôi nhận được một ngoại lệ. Theo như tôi biết mã không phải là Android cụ thể vì vậy nó không phải là một vấn đề.

Dưới đây là chức năng mã hóa của tôi

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

Khi tôi gọi Encryption.encrypt("myString"); tôi nhận được ngoại lệ sau đây:

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

Như tôi đã nói mã này đang làm việc tốt trên Android và nó không nên thực hiện bất kỳ sự khác biệt nơi nó đang chạy.

Cảm ơn bạn đã trợ giúp bạn có thể cung cấp.

CẬP NHẬT

tôi thấy rằng tôi cần PKCS5Padding thay vì 7 nhờ vào một liên kết trên một nhận xét. Hiện tại, tôi nhận được ngoại lệ sau:

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

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

+0

cám ơn khi tôi googled tôi không tìm thấy bất cứ điều gì mặc dù bây giờ mà tôi đã thay đổi nó bây giờ nói với tôi rằng chìa khóa là một kích thước không hợp lệ – Boardy

+0

Bạn sẽ cần các tệp chính sách JCE sức mạnh không giới hạn. http://deveshsharma.info/2012/10/09/fixing-java-security-invalidkeyexception-illegal-key-size-exception/ – srkavin

Trả lời

16

Đầu tiên, trong Java, tên đệm chuẩn là PKCS5Padding, chứ không phải PKCS7Padding. Java thực sự đang thực hiện đệm PKCS # 7, nhưng trong đặc tả kỹ thuật JCA, PKCS5Padding là tên được đưa ra.

Tiếp theo, bạn đang cố gắng sử dụng AES-256, vì vậy bạn sẽ cần phải cài đặt các tệp chính sách Unlimited Strength Jurisdiction.

Hy vọng đây chỉ là ví dụ và bạn không sử dụng cùng một IV cho mọi thư, đúng không?

+0

Nó chỉ là một ví dụ, tôi đã sao chép các chính sách nhưng tôi vẫn nhận được cùng một ngoại trừ – Boardy

+0

Bạn có thể đã có phiên bản sai hoặc đặt chúng ở vị trí sai. Bạn sẽ cần phải cung cấp thêm chi tiết hoặc chỉ xem xét cẩn thận những gì bạn đã làm. – erickson

+1

Tôi đã tìm thấy sự cố. Tôi đã sao chép các tập tin vào Program Files \ Java \ jre \ ... nhưng tôi đã sử dụng một jre kèm trong thư mục JDK. Tôi sao chép các tập tin vào này và tất cả các công việc của nó bây giờ. Cảm ơn bạn đã giúp đỡ. Hơi lạ của nó mặc dù với tôi tại sao Android không có bất kỳ vấn đề nào trong số này, đặc biệt là khi tôi đang sử dụng cùng một thư viện – Boardy

Các vấn đề liên quan