10

Tình huốngMã hóa RSA trong Java: Các vấn đề nền tảng chéo?

Tôi đang làm việc với mã hóa RSA trong Java. Tôi đang cố gắng mã hóa dữ liệu trên điện thoại của nhà phát triển HTC Saphire (32B) được trang bị Android 2.2 của CyanogenMod và sau đó giải mã dữ liệu trên máy chủ 64 bit chạy Mandriva Linux 2010. Tôi đang sử dụng cùng một khóa công khai, cặp khóa riêng trên cả hai máy , có thể mã hóa/giải mã một cách chính xác dữ liệu trên điện thoại Android, có thể mã hóa/giải mã dữ liệu một cách chính xác trên máy chủ Linux, nhưng tôi không thể mã hóa dữ liệu trên điện thoại và sau đó giải mã dữ liệu trên máy chủ. Tôi nhận được ngoại lệ đệm xấu. Tôi đã xác nhận rằng dữ liệu đang được gửi chính xác bằng điện thoại và đang được máy chủ phân tích cú pháp chính xác. Như vậy, tôi không thể hiểu tại sao giải mã không thành công. Bất cứ ai có thể giúp tôi với điều này? Có lẽ thuật toán RSA trong Java có một số giả định cơ bản về kích thước từ?

Thông tin thêm:

  • mã hóa Thư viện của tôi/giải mã dựa trên hướng dẫn tìm thấy here.
  • khóa mã hóa của tôi là 2048 bit chiều dài, nhưng tôi thấy hành vi tương tự với kích thước phím khác nhau.
  • Tôi đã đóng gói mã hóa/giải mã RSA của tôi vào một tệp jar. Nó được biên dịch qua Eclipse trên máy của máy chủ.
  • Chương trình sử dụng thư viện mã hóa trên điện thoại Android sử dụng thư viện ở trên. Nó cũng được xây dựng bằng cách sử dụng Eclipse.
  • Chương trình máy chủ được xây dựng bằng cách sử dụng Netbeans (vì lúc đó dễ dàng hơn).

Câu hỏi khác

  • Có miễn phí thuật toán mã hóa khóa công khai/thư viện khác có sẵn cho Java? Họ có làm việc trên nhiều nền tảng không? Hiệu suất mong đợi từ họ là gì? Vv, v.v. Tôi đã xem xét điều này và không tìm thấy nhiều; có lẽ tôi đang tìm kiếm với các từ khóa sai.

Phew! Tôi nghĩ vậy. Cảm ơn vì sự giúp đỡ của bạn trước đó!

+0

bất kỳ thuật toán nào phải hoạt động trên nền tảng, vấn đề ở trong mã của bạn (hoặc cấu hình) rất có thể là – bestsss

+0

Config, eh? Cấu hình RSA là gì? Làm thế nào tôi sẽ làm điều này trong Java? Bạn có thể cung cấp liên kết đến hướng dẫn không? Tôi không muốn mất thời gian của bạn, nhưng có một chuyên gia (hoặc cá nhân có kinh nghiệm) như bạn chỉ cho tôi đi đúng hướng sẽ thực sự làm cho cuộc sống của tôi dễ dàng hơn. –

+0

(sry chạy đi cho bữa ăn tối) Tôi có nghĩa là cấu hình như khóa công khai/tư nhân, padding xấu chủ yếu là do cặp khóa trao đổi nặng. Nếu bạn chắc chắn và vì lý do nào đó android không hỗ trợ cùng một padding như impl của mặt trời. bạn có thể thử http://www.bouncycastle.org/ btw, làm cách nào để mã hóa/giải mã dữ liệu trên cùng một thiết bị/máy? – bestsss

Trả lời

12

Mã hóa RSA (hoặc bất kỳ thuật toán mã hóa nào) sẽ hoạt động bất kể môi trường. Tuy nhiên, có thể một số hệ thống nhất định đưa ra các giả định khác nhau về đệm mặc định và phương thức hoạt động. Hãy chắc chắn rằng khi bạn đang thực hiện mã hóa và giải mã mà bạn hoàn toàn xác định không chỉ các thuật toán, mà còn là phương thức hoạt động (CBC, vv) và padding. Nếu điều đó không hiệu quả, tôi khuyên bạn nên đăng mã của mình từ cả thiết bị và máy chủ để chúng tôi có thể kiểm tra kỹ hơn.

Sửa Để giải quyết câu hỏi của bạn, trong Java, khi bạn nhận được một mật mã từ gói crypto, bạn thường làm như vậy với đoạn mã sau:

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

Chuỗi cung cấp cho getInstance chỉ thị thời gian chạy để có được một ví dụ mã hóa sẽ sử dụng thuật toán AES, chế độ chuỗi khối mật mã hoạt động và Vùng đệm PKCS5. Có một số thuật toán và paddings được hỗ trợ.Tôi sẽ kiểm tra this document from Oracle để biết thêm thông tin về mã hóa trong Java.

Để cụ thể hơn, chuỗi bạn sử dụng để yêu cầu một mật mã có định dạng

<algorithm>/<mode of operation>/<padding> 

Để làm cho vấn đề tồi tệ hơn, mặc dù Java cung cấp một số thuật toán, phương thức hoạt động và miếng đệm không, không phải tất cả chúng sẽ hoạt động cùng nhau. Bạn sẽ cần đọc tài liệu để tìm chuỗi cấu hình sẽ hoạt động.

+0

Làm cách nào để xác định phương thức hoạt động và phần đệm? Tôi không thực sự nhận thức được tất cả các tùy chọn mà tôi có thể chuyển đổi khi sử dụng RSA. Có bất kỳ liên kết tốt nào mà tôi có thể bắt đầu, hoặc một số lời khuyên chung? –

+0

Liên kết và lời khuyên của bạn trông cực kỳ hứa hẹn. Tôi không thể thử nó bây giờ, nhưng đến thứ tư tôi có thể có cơ hội; Tôi sẽ cố gắng báo cáo lại càng sớm càng tốt. Chỉ để đảm bảo rằng tôi hiểu bạn, mỗi khi tôi tạo mật mã, tôi chỉ định thuật toán, chế độ và phần đệm và điều này có thể _potentially_ xóa mọi giả định dựa trên nền tảng được tạo, phải không? –

+0

Điều này hoạt động tốt; chắc hẳn đã có một số giả định được thực hiện mà trước đây tôi không kiểm soát được. Cảm ơn bạn đã giúp đỡ! –

0

Có lẽ bạn nên kiểm tra dữ liệu và đảm bảo rằng đó chính xác là những gì bạn muốn chuyển vào các API mã hóa/giải mã.

+0

Ah, tôi đã thực hiện kiểm tra. Như tôi đã nói, dữ liệu dường như chỉ tốt (và có thể được giải mã trên hệ thống đã tạo ra nó), nhưng dữ liệu được mã hóa trên điện thoại không thể được giải mã trên thiết bị. Tuy nhiên, cảm ơn lời khuyên! –