2011-12-25 35 views
5
cipher = Cipher.getInstance("Blowfish"); 

Điều này ném một ngoại lệ java.security.NoSuchAlgorithmException: Mật mã Không tìm thấy thực thi Blowfish.Mã hóa blowfish trong android

Tôi đã kiểm tra cả local_policy.jar và US_export_policy.jar tồn tại và chúng không bị thay đổi từ thời điểm cài đặt java. Điều gì có thể gây ra vấn đề này?

Edit:

Object[] o = Security.getAlgorithms("Cipher").toArray(); 
    for (int i=0; i<o.length; i++) { 
     System.out.println((String)o[i]); 
    } 

Khi tôi chạy mã này tôi nhận được danh sách không có "Blowfish" nhưng các tên thuật toán như DES hoặc RSA còn một số cái tên lạ như "1.2.840.113549.1.1.7" và như thế. Tại sao không có Blowfish ở đó hay nó ẩn trong những con số đó?

Trả lời

2

Yeap, tôi không thể tìm ra giải pháp và chỉ được sử dụng thư viện crypto GNU. Nó hoạt động tốt.

2

cipher = Cipher.getInstance("Blowfish")

chỉ làm việc với Android 2.3 trở lên, vì vậy nó có thể là mục tiêu của bạn là dưới Android 2.3?

EDIT: Nếu bạn muốn xây dựng lên 2,3 hoặc giả sử 4.0 ICS mà còn hỗ trợ các thiết bị thấp hơn bạn có thể thêm một cái gì đó như thế này để manifest.xml của bạn:

<uses-sdk android:minSdkVersion="3" /> 
<uses-sdk android:targetSdkVersion="14" /> 

Vấn đề duy nhất là bạn sẽ phải cung cấp Blowfish như là một lựa chọn mà sẽ không phải là một lựa chọn hợp lệ (không thể nhấp/xám) của một phương thức mã hóa cho bất kỳ ai dưới 2.3, tôi cho rằng. Kiểm tra nó! Xây dựng nó và thử trên nhiều phiên bản SDK khác nhau. Chúc may mắn!

+0

Tôi sử dụng Android 2.1, sau đó làm cách nào tôi có thể sử dụng Blowfish trong Android 2.1? – Sergey

+0

Thật không may, bạn không thể. Tuy nhiên, bạn luôn có thể nhắm mục tiêu 2.3 nhưng cho phép các phiên bản SDK thấp hơn như thế này. Tôi sẽ đăng mã trong bản chỉnh sửa ở trên làm giải pháp. – TryTryAgain

+0

đó là vấn đề, tôi cần 2,1 mã hóa – Sergey

2

Giải pháp duy nhất tôi có thể đề xuất là gói bên ngoài nếu bạn muốn hỗ trợ nền tảng hoàn chỉnh.

Android đi kèm với phiên bản BouncyCastle bị tước bỏ. Tôi tin là có thêm các chức năng bổ sung khi tiến trình phiên bản.

Tuy nhiên, việc nhập bình BouncyCastle hoàn chỉnh vào Android sẽ gây ra rất nhiều sự cố khi phiên bản Android sử dụng cùng tên.

Giải pháp tôi đã sử dụng là sử dụng SpongyCastle. Tôi đã sử dụng nó trước đây, nhưng chưa xem qua mã nguồn để đảm bảo không có thay đổi nào được thực hiện.

Một hướng dẫn để cài đặt: How to include the Spongy Castle JAR in Android?

2

local_policy.jar và US_export_policy.jar không liên quan đến Android. Bạn cần chạy mã danh sách thuật toán trên Android để nhận kết quả có ý nghĩa. Như những người khác đã lưu ý, nhà cung cấp JCE Android dựa trên Lâu đài Bouncy, nhưng nó không bao gồm tất cả các thuật toán. Bạn cần phải gói toàn bộ lib trong ứng dụng của mình để có thể sử dụng tất cả các thuật toán. Sử dụng Spongy Castle để làm việc này dễ dàng hơn. Sau khi bạn làm, sự thay đổi duy nhất mà bạn sẽ cần là để xác định các nhà cung cấp như 'SC':

Cipher c = Cipher.getInstance("Blowfish", "SC"); 
0

Tôi đã sử dụng mã hóa blowfish trên ứng dụng Android của mình. Tôi không biết tại sao nhưng mã hóa blowfish đã được nhận xét ra khỏi thư viện lâu đài bouncy trên android.

Tôi phải tải xuống các nguồn lâu đài bouncy, tôi đã đổi tên nhà cung cấp từ BC thành BC2 và đổi tên thành tên gói thành bouncycastle2 để tránh xung đột với tên gói trên sdk android. Sau đó, tôi thêm lọ Lâu đài Bouncy tùy chỉnh này vào ứng dụng của tôi như một cái lọ mới và nó hoạt động tốt!

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