เหตุใดการเข้ารหัส AES ของสตริงเดียวกันที่มีคีย์เดียวกันจึงแตกต่างกันเสมอ

ฉันมีไฟล์ชื่อ plain.txt ภายในไฟล์ฉันมี:

Hello Hello Hello Hello

ฉันใช้คำสั่งนี้เพื่อเข้ารหัส:

openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin

จากนั้นฉันก็พิมพ์ค่าที่เข้ารหัสดังนี้:

buff = open("encrypted.bin")
cipher = buff.read()
buff.close()
print b64encode(cipher)

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

Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+AmoQiIkYAxIYanLr/kbjMfEJPPLfeE/wtyxScvAKzb7K38ZxoI097
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX19vPD+OoiK7iSgYJiPMxuKGNWWrLlfBS0c3yCJkuv7QIBGEo2Q86UsV
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+3I8EC7u3lrcVPyD/JV12NAecWvTPXGga0Nh2cwqLAtGCDhLK6MI9g
Richard-Knops-MacBook-Pro:python_test richardknop$ 

person Richard Knop    schedule 05.08.2012    source แหล่งที่มา
comment
โดยพื้นฐานแล้ว ข้อความตัวเลขควรมีลักษณะเป็นเอาต์พุตแบบสุ่มเสมอ หากไม่เป็นเช่นนั้นข้อมูลจะรั่วไหล ในกรณีนี้ คุณจะสามารถดูได้ว่าการเข้ารหัสด้วยรหัสผ่านเดียวกันเริ่มต้นด้วยค่าที่เหมือนกันซึ่งเข้ารหัสไว้ก่อนหน้านี้หรือไม่ ลองนึกภาพบทสนทนาต่อไปนี้: คุณคือ BadEncryption ทั่วไปหรือเปล่า? คำตอบที่เข้ารหัส: ใช่ เราควรโจมตีตอนรุ่งสางไหม? คำตอบที่เข้ารหัส: ใช่ ดังนั้นศัตรูจะเห็นข้อความที่เข้ารหัสแต่เหมือนกัน และเริ่มควบคุมปืนครก   -  person Maarten Bodewes    schedule 05.08.2012


คำตอบ (4)


เพราะ “เกลือ” แตกต่างกันไปในแต่ละครั้ง สิ่งนี้จะป้องกัน เช่น การโจมตีประเภทตารางสีรุ้งกับค่าที่เข้ารหัส ดู http://en.wikipedia.org/wiki/Salt_%28cryptography%29

person podiluska    schedule 05.08.2012
comment
ฉันสามารถเข้ารหัสโดยไม่ใช้เกลือได้หรือไม่ พารามิเตอร์คืออะไร? - person Richard Knop; 05.08.2012
comment
คุณสามารถใช้ -nosalt แต่มันไม่แนะนำ - person podiluska; 05.08.2012

เหตุผลที่คุณได้รับสตริงที่เข้ารหัสต่างกันคือ " enc -aes-128-cbc" CBC ย่อมาจาก Cipher Block Chaining ดังนั้นสำหรับบล็อกที่ 2 เอาต์พุตที่เข้ารหัสของบล็อกแรกจะทำหน้าที่ ac IV ดังนั้นแต่ละครั้งที่คุณได้รับสตริงที่แตกต่างกัน สำหรับรายละเอียดเพิ่มเติม google "AES ในโหมด CBC"

person Rahul Goyal    schedule 15.11.2013

คุณได้รับเอาต์พุตที่แตกต่างกันในการรันแต่ละครั้ง เนื่องจากมีการสร้างเกลือใหม่ทุกครั้งที่คุณรันคำสั่ง เพื่อให้เกลือเท่ากันสำหรับการรันแต่ละครั้งติดต่อกัน ให้ใช้ตัวเลือก -S salt เช่น

openssl enc -aes-128-cbc -salt -S "Salt" -k "Hello" -in plain.txt -out encrypted.bin
person Mr. Deathless    schedule 20.11.2013

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

Opensl ใช้เกลือเป็นค่าเริ่มต้นเพื่อลดการโจมตีจากพจนานุกรม หากคุณไม่ต้องการใช้ ให้ใช้เกลือแบบเดียวกับที่คำตอบอื่นแนะนำ หรือเพิ่มตัวเลือก nosalt ดังนี้:

openssl enc -aes-128-cbc -nosalt -k "Hello" -in plain.txt -out encrypted.bin

คุณสามารถดูไซเฟอร์เท็กซ์ในรูปแบบฐานสิบหกได้โดยใช้ xxd

xxd encrypted.bin
person Shaboti    schedule 27.03.2019