ฟังก์ชันแฮช OpenSSL สำหรับสร้างคีย์ AES


8

ฟังก์ชัน hash ใดที่ OpenSSL ใช้สร้างคีย์สำหรับ AES-256 ฉันหาที่ใดก็ได้ในเอกสารของพวกเขาไม่พบ

$ touch file
$ openssl aes-256-cbc -nosalt -P -in file

enter aes-256-cbc encryption password: (I type "a" and hit enter)
Verifying - enter aes-256-cbc encryption password: (I type "a" and hit enter)

key=0CC175B9C0F1B6A831C399E269772661CEC520EA51EA0A47E87295FA3245A605
iv =4FA92C5873672E20FB163A0BCB2BB4A4

อัลกอริทึมแฮชใดที่สร้างแฮชที่ไม่ผ่านการกรองหลังจากkey=บรรทัดสุดท้ายที่สองสำหรับอินพุต "a"

คำตอบ:


9

ค่อนข้างแน่ใจว่าเป็นอัลกอริธึมการแยกย่อย SHA1 แต่โดยความจริงแล้วฉันไม่สามารถพูดได้อย่างมั่นใจ 100%

และใครจะคิดว่าสิ่งที่ออกแบบมาเพื่อเพิ่มความป้านจะมีคำแนะนำป้าน;)

แก้ไข: สิ่งนี้อาจไม่เป็นประโยชน์ในสถานการณ์ของคุณ แต่ฉันคิดว่าคุณสามารถรู้ได้ตลอดเวลาด้วยการทำ

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 

ฉันได้พิจารณาแล้วว่าจะใช้ MD5 เป็นค่าเริ่มต้นเนื่องจากเมื่อฉันใช้คำสั่งของคุณ (sidenote: ไม่มีตัวเลือกเหล่านั้นที่ได้รับการบันทึกไว้ในหน้า mage ... ) ด้วยmd5แทนที่จะsha1ได้รับผลลัพธ์เดียวกันกับที่ฉันโพสต์ในตอนแรก คำถามคือจะรับ 256 บิตจาก MD5 (อัลกอริทึมการแฮช 128 บิต) ได้อย่างไร
mk12

วิธีหนึ่งที่ทำได้คือการเชื่อม MD5 สองตัวที่ต่างกันในรูปแบบไบนารีซึ่งส่งผลให้เกิดคีย์ 256 บิตที่แท้จริง มีวิธีการอื่น ๆ เช่นนี้ คุณอาจลองดูแพ็คเกจ php "md5_base64" แม้ว่าคุณจะไม่ใช่ php guy, docs นั้นค่อนข้างให้ข้อมูล
Snesticle

4

มันเป็นการต่อเชื่อมของแฮ็ค MD5 สองตัว

มันได้มาเช่นนี้

128bit_Key = MD5(Passphrase + Salt)
256bit_Key = 128bit_Key + MD5(128bit_Key + Passphrase + Salt)

คุณสามารถตรวจสอบสิ่งนี้ได้โดยทำ:

$ echo Testing > file
$ openssl enc -aes-256-cbc -p -in file -out file.aes -salt
: enter aes-256-cbc encryption password: abc
: Verifying - enter aes-256-cbc encryption password: abc
: salt=3025373CA0530C93
: key=E165475C6D8B9DD0B696EE2A37D7176DFDF4D7B510406648E70BAE8E80493E5E
: iv =B030394C16C76C7A94DC22FDDB6B0744
$ perl -e 'print pack "H*", "3025373CA0530C93"' > salt
$ echo -n abc > passphrase
$ cat passphrase > key.128.tmp
$ cat salt >> key.128.tmp
$ md5sum key.128.tmp 
: e165475c6d8b9dd0b696ee2a37d7176d  key.128.tmp
$ perl -e 'print pack "H*", "e165475c6d8b9dd0b696ee2a37d7176d"' > key.128
$ cat key.128 > key.256.tmp
$ cat passphrase >> key.256.tmp
$ cat salt >> key.256.tmp
$ md5sum key.256.tmp 
: fdf4d7b510406648e70bae8e80493e5e  key.256.tmp

สังเกตว่า MD5 ของ 'key.128.tmp' และ 'key.256.tmp' ถูกรวมเข้าด้วยกันก่อให้เกิดคีย์เดียวกันกับเอาต์พุตที่คำสั่งเริ่มต้น


และถ้าคุณทำซ้ำครั้งที่สามคุณจะได้ IV กรณีนี้สะดวกเนื่องจากขนาดคีย์และข้อมูล = IV (256 และ 128 บิต) เป็นทั้งทวีคูณที่แน่นอนของเอาต์พุตแฮช โดยทั่วไปคุณทำการต่อแฮชเอาท์พุทและรับบิต K แรกสำหรับคีย์และบิต D ถัดไปสำหรับ IV
dave_thompson_085

อัพเดต: ค่าเริ่มต้นเคยเป็น md5 แต่ตั้งแต่ 1.1.0 ในปี 2559 มันคือ sha256 รายละเอียดทั้งหมดได้ที่crypto.stackexchange.com/questions/3298/…
dave_thompson_085

2

OpenSSL ใช้ AES กับ SHA1

หากคุณต้องการที่จะตรวจสอบแหล่งที่มากว่า OpenSSL ดีเขียนได้ดูบทความ
คลาส c ++ ที่อินเตอร์เฟซการยันต์

บทความประกอบด้วยซอร์สโค้ดที่ง่ายมากซึ่ง:

ช่วยให้คุณเข้ารหัสและถอดรหัสไฟล์หรือสตริงโดยใช้ OpenSSL AES-256-CBC cipher และอัลกอริทึมย่อย SHA1 มันทำงานร่วมกันได้กับเครื่องมือบรรทัดคำสั่ง openssl ซึ่งทำให้การแนะนำที่ดีในการใช้ OpenSSL สำหรับการเข้ารหัส


1

ผมไม่ทราบว่าคำตอบ แต่คุณอาจจะพบว่ามันได้อย่างง่ายดายพอในรหัสที่มา OpenSSL


2
"ง่ายพอ" - mainฟังก์ชั่น (ที่ฟังก์ชั่นขอรหัสผ่านมีชีวิตอยู่) ~ 500 บรรทัดยาวและเกลื่อนไปด้วยgotos
mk12

5
ว้าว. ฉันเพิ่งดูซอร์สโค้ด มันอ่านไม่ได้จริง ไม่มีความคิดเห็น. ชื่อตัวแปรหนึ่งตัวอักษร ฮึ. ฉันขอโทษฉันแนะนำว่า
ฟราน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.