it-swarm-vi.com

Làm cách nào để mã hóa tin nhắn / văn bản với RSA & OpenSSL?

Tôi có khóa công khai của Alice. Tôi muốn gửi cho Alice một tin nhắn được mã hóa RSA. Làm cách nào tôi có thể thực hiện bằng lệnh openssl?

Tin nhắn là:

Chào Alice! Vui lòng mang theo malacpörkölt cho bữa tối!

29
LanceBaynes

Trong thủ công openssl (openssl man page), tìm kiếm RSA, và bạn sẽ thấy rằng lệnh mã hóa RSA là rsautl. Sau đó đọc rsautl man page để xem cú pháp của nó.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

Mặc định lược đồ đệm là PKCS # 1 v1.5 ban đầu (vẫn được sử dụng trong nhiều gói); openssl cũng hỗ trợ OAEP (hiện được khuyến nghị) và mã hóa thô (chỉ hữu ích trong các trường hợp đặc biệt).

Lưu ý rằng sử dụng openssl trực tiếp chủ yếu là một bài tập. Trong thực tế, bạn sẽ sử dụng một công cụ như gpg (sử dụng RSA, nhưng không trực tiếp để mã hóa tin nhắn).

Đầu tiên, nếu bạn chỉ muốn mã hóa tốt, bạn nên xem GnuPG . Nhưng nếu thử nghiệm của bạn và chỉ muốn tìm hiểu cách thức hoạt động của nó, bạn cần hiểu RSA là gì. RSA không được thiết kế để mã hóa bất kỳ chuỗi tùy ý nào, đó là thuật toán mã hóa một số nguyên. Cụ thể, một số nguyên từ 0 đến n-1 trong đó n là giá trị mô đun từ khóa chung. Khi bạn nói về khóa RSA là 1024 bit, điều đó có nghĩa là phải mất 1024 bit để lưu trữ mô-đun ở dạng nhị phân. Đây là một trong những lý do, RSA được sử dụng kết hợp với mật mã khóa đối xứng như DES hoặc AES . Bạn có thể tạo khóa 256 bit ngẫu nhiên cho AES và mã hóa khóa đó bằng khóa công khai RSA 1024 bit. Sau đó, bất cứ ai truy cập vào khóa riêng đều có thể trích xuất khóa đối xứng và giải mã tin nhắn bằng AES. Tiêu chuẩn đầy đủ cho RSA được gọi là PKCS # 1

Hơn nữa, DES và AES là mật mã khối. Họ chỉ mã hóa dữ liệu theo khối có kích thước cụ thể. DES sử dụng khối 64 bit và AES sử dụng 128 bit Để mã hóa nhiều hơn một khối, bạn phải sử dụng Chế độ hoạt động như CBC hoặc CTR. Các chế độ này chỉ định cách mã hóa luồng bit bằng mật mã chế độ khối.

Cuối cùng, điều quan trọng là xác minh dữ liệu bạn đang nhận. Trong khi kẻ tấn công có thể không đọc được dữ liệu trong quá trình, anh ta có thể lật các bit mà không bị phát hiện nếu không áp dụng tính toàn vẹn hoặc tính xác thực cho luồng dữ liệu. Kẻ tấn công có thể dễ dàng đoán rằng kết nối SSL tới cổng 443 có thể là một yêu cầu trang web bắt đầu bằng GET / và anh ta có thể lật bit thay đổi thành PUT / mà không can thiệp vào phần còn lại của mã hóa. Một cách tiếp cận đơn giản đối với tính toàn vẹn là nối thêm tổng MD5 hoặc SHA-1 vào cuối, nhưng điều đó chỉ cung cấp tính toàn vẹn dữ liệu, không phải tính xác thực dữ liệu. Bất kỳ ai có kiến ​​thức đầy đủ về luồng dữ liệu đều có thể tạo ra một tổng chính xác, cách tiếp cận an toàn hơn là sử dụng hàm băm có khóa như HMAC đòi hỏi kiến ​​thức về một khóa bí mật để tạo ra do đó cung cấp tính xác thực dữ liệu ngoài tính toàn vẹn.

25
penguin359

Trong phần bên dưới, lưu ý bạn có thể chỉ định bất kỳ thuật toán nào bạn muốn, có thể là thuật toán được liệt kê hoặc RSA (mặc dù tôi không biết tên chính xác được sử dụng cho RSA bởi OpenSSL)

sử dụng "openssl enc -help" để nhận danh sách các mật mã được hỗ trợ trên hệ thống của bạn và chuyển nó làm đối số. ví dụ: "-aes256"

Lưu ý trên hệ thống của tôi, tôi không có RSA trong các tùy chọn của mình - ít nhất là theo tên đó.


Làm cách nào để mã hóa tin nhắn S/MIME?

Hãy nói rằng ai đó gửi cho bạn chứng chỉ công khai của cô ấy và yêu cầu bạn mã hóa một số tin nhắn cho cô ấy. Bạn đã lưu chứng chỉ của mình dưới dạng her-cert.pem. Bạn đã lưu câu trả lời của bạn dưới dạng my-message.txt.

Để có được mã mặc định, mặc dù mã hóa RC2-40 khá yếu, bạn chỉ cần thông báo openssl nơi đặt thông báo và chứng chỉ.

openssl smime her-cert.pem -encrypt -in my-message.txt

Nếu bạn rất chắc chắn rằng phóng viên từ xa của bạn có bộ công cụ SSL mạnh mẽ, bạn có thể chỉ định một thuật toán mã hóa mạnh hơn như bộ ba DES:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

Theo mặc định, tin nhắn được mã hóa, bao gồm các tiêu đề thư, được gửi đến đầu ra tiêu chuẩn. Sử dụng tùy chọn -out hoặc Shell của bạn để chuyển hướng nó đến một tệp. Hoặc, phức tạp hơn nhiều, dẫn đầu ra trực tiếp đến sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

Làm cách nào để tôi ký một tin nhắn S/MIME?

Nếu bạn không cần mã hóa toàn bộ tin nhắn, nhưng bạn muốn ký nó để người nhận của bạn có thể yên tâm về tính toàn vẹn của tin nhắn, công thức này tương tự như mã hóa. Sự khác biệt chính là bạn cần phải có khóa và chứng chỉ của riêng mình, vì bạn có thể ký bất cứ điều gì với chứng nhận của người nhận.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(từ http://www.madboa.com/geek/openssl/ )

(er ... tất cả các dấu gạch chéo ngược - những thứ được cho là đã thoát dòng mới. Không chắc chắn những gì đang xảy ra, vì nó hiển thị tốt trong hộp chỉnh sửa của tôi ở đây!

5
draeath