วิธีเข้ารหัสข้อความ / ข้อความด้วย RSA & OpenSSL


29

ฉันมีกุญแจสาธารณะของอลิซ ฉันต้องการส่งข้อความเข้ารหัสของ RSA ของอลิซ ฉันจะทำมันโดยใช้opensslคำสั่งได้อย่างไร

ข้อความคือ:

สวัสดีอลิซ! กรุณานำmalacpörköltมาทานอาหารเย็นด้วย!

คำตอบ:


36

ในคู่มือ OpenSSL ( opensslหน้าคน) ค้นหาRSAและคุณจะเห็นว่าคำสั่งสำหรับการเข้ารหัส RSA rsautlเป็น จากนั้นอ่านrsautlman pageเพื่อดูไวยากรณ์

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

ชุดรูปแบบการแพ็ดเริ่มต้นคือ PKCS # 1 v1.5 ดั้งเดิม (ยังคงใช้ในหลาย procotols); openssl ยังรองรับ OAEP (แนะนำในขณะนี้) และการเข้ารหัสแบบดิบ (มีประโยชน์เฉพาะในกรณีพิเศษ)

โปรดทราบว่าการใช้ openssl โดยตรงส่วนใหญ่เป็นการฝึกหัด ในทางปฏิบัติคุณจะต้องใช้เครื่องมือเช่นgpg (ซึ่งใช้ RSA แต่ไม่ใช่เพื่อเข้ารหัสข้อความโดยตรง)


ปัญหาการใช้งานopensslคืออะไร
Bratchley

2
@Bratchley opensslเครื่องมือบรรทัดคำสั่งเป็นส่วนผสมของคำสั่งที่แตกต่างกัน บางคนส่วนใหญ่เป็นคนที่จัดการใบรับรองอาจมีประโยชน์ แต่ยากที่จะใช้อย่างถูกต้องเพราะไวยากรณ์และพารามิเตอร์ของพวกเขาแปลก บางอย่างrsautlก็ใช้ได้ แต่ไม่มีฟังก์ชั่นที่มีประโยชน์พวกเขาเพียงแค่เปิดเผยพื้นฐานการเข้ารหัสลับดิบ - ตัวอย่างเช่นการเข้ารหัส RSA นั้นใช้ในการเข้ารหัสคีย์สมมาตรสำหรับการเข้ารหัสแบบไฮบริด บางคนชอบencใช้งานอย่างหนักและโลกจะดีกว่าหากไม่มีตัวตน
Gilles 'ดังนั้นหยุดความชั่วร้าย'

คำตอบที่ดี ฉันได้เพิ่มช่องว่างภายในด้วยแฟล็กนี้ -aep จากนั้นในการถอดรหัสให้ระบุเหมือนกัน ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

ขั้นแรกถ้าคุณต้องการเพียงแค่การเข้ารหัสที่ดีคุณควรมีลักษณะที่GnuPG แต่ถ้าคุณทำการทดลองและต้องการเรียนรู้วิธีการทำงานคุณต้องเข้าใจว่าRSAคืออะไร RSA ไม่ได้ออกแบบมาเพื่อเข้ารหัสสตริงใด ๆ โดยพลการมันเป็นอัลกอริทึมที่เข้ารหัสจำนวนเต็ม โดยเฉพาะจำนวนเต็มตั้งแต่ 0 ถึง n-1 โดยที่ n คือค่าโมดูลัสจากคีย์สาธารณะ เมื่อคุณพูดถึงคีย์ RSA นั่นคือ 1024 บิตนั่นหมายความว่าใช้เวลา 1024 บิตในการจัดเก็บโมดูลัสในรูปแบบไบนารี นี่คือหนึ่งในเหตุผลที่ RSA ใช้ร่วมกับรหัสตัวเลขแบบสมมาตรเช่นDESหรือAES. คุณสามารถสร้างคีย์สุ่ม 256 บิตสำหรับ AES และเข้ารหัสคีย์นั้นด้วยคีย์สาธารณะ RSA 1024 บิต จากนั้นทุกคนที่เข้าถึงคีย์ส่วนตัวสามารถแยกคีย์สมมาตรและถอดรหัสข้อความด้วย AES มาตรฐานแบบเต็มสำหรับ RSA เรียกว่าPKCS # 1

นอกจากนี้ DES และ AES ยังเป็นบล็อกเลขศูนย์ พวกเขาเข้ารหัสข้อมูลในบล็อกที่มีขนาดเฉพาะเท่านั้น DES ใช้บล็อก 64- บิตและ AES ใช้บล็อก 128- บิต ในการเข้ารหัสมากกว่าบล็อกคุณต้องใช้โหมดการทำงานเช่น CBC หรือ CTR โหมดเหล่านี้ระบุวิธีเข้ารหัสสตรีมบิตโดยใช้รหัสโหมดบล็อก

ท้ายสุดสิ่งสำคัญคือการตรวจสอบข้อมูลที่คุณได้รับ ในขณะที่ผู้โจมตีอาจไม่สามารถอ่านข้อมูลในระหว่างการขนส่งได้เขาอาจสามารถพลิกบิตได้โดยไม่ต้องตรวจจับหากไม่มีการตรวจสอบความสมบูรณ์หรือความถูกต้องกับกระแสข้อมูล ผู้โจมตีสามารถคาดเดาได้อย่างง่ายดายว่าการเชื่อมต่อ SSL กับพอร์ต 443 อาจเป็นคำขอหน้าเว็บที่เริ่มต้นด้วยGET /และเขาสามารถพลิกการเปลี่ยนแปลงบิตเป็นPUT /โดยไม่รบกวนการเข้ารหัสที่เหลือ วิธีการที่เรียบง่ายเพื่อความสมบูรณ์คือการผนวกผลรวมของ MD5 หรือ SHA-1 ไว้ท้าย แต่จะให้ความสมบูรณ์ของข้อมูลเท่านั้นไม่ใช่ความถูกต้องของข้อมูล ผู้ใดที่มีความรู้อย่างสมบูรณ์ของสตรีมข้อมูลสามารถสร้างผลรวมที่ถูกต้องวิธีการที่ปลอดภัยยิ่งขึ้นคือการใช้แฮชแบบมีรหัสเช่นHMAC ซึ่งต้องใช้ความรู้ของคีย์ลับในการสร้างจึงให้การรับรองความถูกต้องของข้อมูลนอกเหนือจากความสมบูรณ์


2
นี่เป็นสิ่งที่ดีจริงๆ
mko

5

ในด้านล่างโปรดทราบว่าคุณสามารถระบุอัลกอริทึมที่คุณต้องการไม่ว่าจะเป็นรายการที่ระบุหรือ RSA (แม้ว่าฉันจะไม่ทราบชื่อที่แน่นอนที่ใช้สำหรับ RSA โดย OpenSSL)

ใช้ "openssl enc -help" เพื่อรับรายการของ ciphers ที่ได้รับการสนับสนุนในระบบของคุณและส่งผ่านสิ่งนั้นเป็นอาร์กิวเมนต์ เช่น "-aes256"

หมายเหตุในระบบของฉันฉันไม่มี RSA ในตัวเลือกของฉัน - อย่างน้อยโดยชื่อนั้น


ฉันจะเข้ารหัสข้อความ S / MIME ได้อย่างไร

สมมติว่ามีคนส่งใบรับรองสาธารณะให้เธอและขอให้คุณเข้ารหัสข้อความบางส่วนกับเธอ คุณได้บันทึกใบรับรองของเธอเป็น her-cert.pem คุณได้บันทึกคำตอบของคุณเป็น my-message.txt

ในการรับค่าเริ่มต้น - ค่อนข้างอ่อนแอ - การเข้ารหัส RC2-40 คุณเพียงบอก openssl ว่ามีข้อความและใบรับรองอยู่ที่ไหน

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

หากคุณค่อนข้างมั่นใจว่าผู้ติดต่อระยะไกลของคุณมีชุดเครื่องมือ SSL ที่มีประสิทธิภาพคุณสามารถระบุอัลกอริทึมการเข้ารหัสที่แข็งแกร่งขึ้นเช่น triple DES:

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

ตามค่าเริ่มต้นข้อความที่เข้ารหัสรวมถึงส่วนหัวจดหมายจะถูกส่งไปยังเอาต์พุตมาตรฐาน ใช้ตัวเลือก -out หรือเปลือกของคุณเพื่อเปลี่ยนมันไปยังไฟล์ หรือหากต้องการส่งผลโดยตรงไปยัง 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

ฉันจะเซ็นข้อความ S / MIME ได้อย่างไร

หากคุณไม่จำเป็นต้องเข้ารหัสข้อความทั้งหมด แต่คุณต้องการลงชื่อเพื่อให้ผู้รับของคุณมั่นใจในความถูกต้องของข้อความสูตรจะคล้ายกับการเข้ารหัส ข้อแตกต่างที่สำคัญคือคุณต้องมีรหัสและใบรับรองของคุณเองเนื่องจากคุณไม่สามารถเซ็นชื่ออะไรด้วยใบรับรองของผู้รับ

 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

(จากhttp://www.madboa.com/geek/openssl/ )

(เอ้อ ... แบ็กสแลชเหล่านั้นทั้งหมด - พวกมันควรจะถูกขึ้นบรรทัดใหม่ไม่แน่ใจว่าเกิดอะไรขึ้นเพราะมันแสดงได้ดีในกล่องแก้ไขของฉันที่นี่!


1
คุณต้องใส่ช่องว่างสี่ช่องที่จุดเริ่มต้นของแต่ละบรรทัดเพื่อรักษาบรรทัดใหม่ ฉันเปลี่ยนบล็อกแรกเพื่อแสดงให้คุณเห็นว่า คุณสามารถแก้ไขวินาที
มิเคล

1
คุณไม่พบ RSA openssl encเพราะใช้encสำหรับการเข้ารหัสแบบสมมาตรเท่านั้น ใช่ตัวเลือกของ openssl ไม่ค่อยมีการจัดระเบียบ อัลกอริทึมแบบไม่สมมาตรมีคำสั่งของตนเอง: rsa/ dsa/ dhเพื่อจัดการกับคีย์rsautl/ dsautlเพื่อเข้ารหัส / ถอดรหัส / ตรวจสอบ / ลงนามและgenrsa/ gendsa/ gendhเพื่อสร้างคีย์
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.