2011-08-11 50 views
5

Tôi phải mã hóa một đoạn văn bản bằng Ruby. Tôi đã sử dụng đá quý Ruby-Openssl cho mục đích đó. Văn bản được mã hóa này là chúng được chuyển đến một chương trình python sử dụng mà tôi phải giải mã nó. Tôi đã sử dụng Pycrypto cho mục đích này.Mã hóa/giải mã AES giữa Ruby-OpenSSL, PyCrypto

Vấn đề là, trong Pycrypto chúng ta phải xác định quy ước padding theo cách thủ công. Trong Ruby, phần đệm được thực hiện tự động. Tôi đang sử dụng chế độ mã hóa khối AES-CBC. Lớp đệm này gây ra các vấn đề khi việc loại bỏ nó không thể được thực hiện đúng trong Python. Như một ví dụ, đây là những mã hóa base64 của một văn bản được mã hóa trong cả Ruby và Python:

Python: aENJY28lvE89yY2T/te8vWwdeoeSqSwwlrOAv7b3AWw= 
Ruby: aENJY28lvE89yY2T/te8vVoQE6JNxdSRgYXC8mqF3nI= 

Xin vui lòng giúp ...

Trả lời

3

OpenSSL áp dụng PKCS # 5Theo mặc định, do đó, điều này cũng được sử dụng tự động khi mã hóa dữ liệu với OpenSSL::Cipher ở chế độ AES-CBC (xem OpenSSL docs). Vì vậy, không cần phải thực hiện padding thủ công khi sử dụng Ruby.

Đệm phải được thực hiện manually bằng Python khi sử dụng PyCrypto.

Khi bạn áp dụng lược đồ đệm này trong Python, cả hai chuỗi Base64 được mã hóa phải khớp nhau.

+0

Tôi đã cố gắng sử dụng M2Crypto. Thật không may nó dường như không hoạt động với chương trình được cung cấp trong liên kết. Tôi sẽ cố gắng áp dụng đệm PKCS # 5. – vishy1618

+0

Nó hoạt động bằng cách sử dụng logic đệm, cảm ơn! – vishy1618

+0

Đẹp - bạn được chào đón! – emboss

0

Có vẻ bạn cần phải được quy định cụ thể chế độ đệm đúng để sử dụng trong cả hai các trường hợp - padding là một thuộc tính cơ bản của một dòng mã hóa và phải được kết hợp trên cả người nhận và người gửi.

+0

Đệm có thể được thao tác thủ công trong PyCrypto, tức là bạn đang chỉ định logic mà bạn làm đệm. Trong Ruby, mặt khác, padding được thực hiện tự động, tôi không thấy bất kỳ cách nào để cấu hình nó khác hơn là lặp lại logic trong Python. – vishy1618

+0

Bạn cần phải làm trong Python những gì đang được thực hiện tự động trong Ruby hoặc làm điều đó bằng tay trong cả hai. – agf

+0

Tôi đã không tìm ra cách để làm điều đó bằng tay trong Ruby. Mà lá tôi với sửa đổi chương trình python của tôi, ngoại trừ tôi không biết làm thế nào padding được thực hiện trong Ruby-Openssl. – vishy1618

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