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 thế nào tôi có thể làm điều đó bằng cách sử dụng openssl
lệnh?
Tin nhắn là:
Chào Alice! Vui lòng mang theo malacpörkölt cho bữa tối!
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 thế nào tôi có thể làm điều đó bằng cách sử dụng openssl
lệnh?
Tin nhắn là:
Chào Alice! Vui lòng mang theo malacpörkölt cho bữa tối!
Câu trả lời:
Trong hướng dẫn sử dụng openssl ( openssl
trang man), tìm kiếm RSA
và bạn sẽ thấy rằng lệnh mã hóa RSA là rsautl
. Sau đó đọc rsautl
trang man để 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
Lược đồ đệm mặc định 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).
openssl
cụ dòng lệnh là hỗn hợp các lệnh khác nhau. Một số, chủ yếu là những thao tác chứng chỉ, có thể hữu ích, nhưng khó sử dụng chính xác vì cú pháp và tham số của chúng là kỳ quặc. Một số, như rsautl
, vẫn ổn nhưng không cung cấp chức năng hữu ích, chúng chỉ phơi bày các nguyên hàm mã hóa thô - ví dụ mã hóa RSA được sử dụng khá nhiều để mã hóa khóa đối xứng cho mã hóa lai. Một số, như enc
, rất khó sử dụng một cách an toàn và thế giới sẽ tốt hơn nếu chúng không tồn tại.
Đầ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, 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 trong một khối có kích thước cụ thể. DES sử dụng các khối 64 bit và AES sử dụng các khối 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 xác đị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à yêu cầu trang web bắt đầu GET /
và anh ta có thể lật bit để thay đổi 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 trong đó yêu cầu 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 bên cạnh tính toàn vẹn.
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?
Giả sử 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 mình 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 khá 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ư 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 <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My encrypted reply' |\
sendmail her@heraddress.com
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, thì công thức 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 không thể ký bất cứ điều gì với chứng chỉ của người nhận.
openssl smime \
-sign \
-signer /path/to/your-cert.pem \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My signed reply' |\
sendmail her@heraddress.com
(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!
openssl enc
vì enc
chỉ dành cho mã hóa đối xứng. Vâng, tùy chọn của openssl không được tổ chức tốt. Các thuật toán không đối xứng có các lệnh riêng: rsa
/ dsa
/ dh
để thao tác các khóa, rsautl
/ dsautl
để mã hóa / giải mã / xác minh / ký và genrsa
/ gendsa
/ gendh
để tạo khóa.
openssl
?