Mengapa sandi terenkripsi AES dari string yang sama dengan kunci yang sama selalu berbeda?

Saya memiliki file bernama plain.txt. Di dalam file saya punya:

Hello Hello Hello Hello

Saya menggunakan perintah ini untuk mengenkripsinya:

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

Lalu saya mencetak nilai terenkripsi seperti ini:

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

Tapi nilainya selalu berbeda. Bukankah sandinya harus selalu sama? Saya menggunakan file yang sama dan kata sandi yang sama untuk mengenkripsinya. Ini adalah keluaran terminal saya:

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 sumber
comment
Pada dasarnya, teks sandi harus selalu terlihat sebagai keluaran acak. Jika tidak, maka informasi akan bocor. Dalam hal ini, Anda dapat melihat apakah enkripsi dengan kata sandi yang sama dimulai dengan nilai yang sama yang sebelumnya dienkripsi. Bayangkan percakapan berikut: apakah Anda umum BadEncryption? Jawaban terenkripsi: ya. Haruskah kita menyerang saat fajar? Jawaban terenkripsi: ya. Jadi musuh melihat pesan terenkripsi namun identik dan mulai menggunakan howitzer.   -  person Maarten Bodewes    schedule 05.08.2012


Jawaban (4)


Karena "garam" berbeda-beda setiap waktunya. Hal ini mencegah, misalnya, serangan tipe tabel pelangi pada nilai terenkripsi. Lihat http://en.wikipedia.org/wiki/Salt_%28cryptography%29

person podiluska    schedule 05.08.2012
comment
Bisakah saya mengenkripsinya tanpa menggunakan garam? Apa parameternya? - person Richard Knop; 05.08.2012
comment
Anda dapat menggunakan -nosalt. Tapi itu tidak disarankan. - person podiluska; 05.08.2012

Alasan Anda mendapatkan string terenkripsi yang berbeda adalah " enc -aes-128-cbc". CBC adalah singkatan dari Cipher Block Chaining. Jadi, untuk blok ke-2, keluaran terenkripsi dari blok pertama bertindak ac IV, jadi setiap kali Anda mendapatkan string yang berbeda. untuk lebih jelasnya google "AES dalam mode CBC"

person Rahul Goyal    schedule 15.11.2013

Anda mendapatkan keluaran berbeda pada setiap proses karena garam baru dihasilkan setiap kali Anda menjalankan perintah. Untuk memberikan garam yang sama untuk setiap proses berturut-turut, gunakan opsi -S salt, mis.

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

Alasannya adalah key sebenarnya yang digunakan untuk enkripsi berasal dari passphrase dan SALT Anda. Maka pasti ciphertextnya akan berbeda walaupun tetap menggunakan password yang sama karena SALT berbeda.

Openssl menggunakan garam secara default untuk mengurangi serangan kamus. Jika Anda tidak ingin menggunakannya maka gunakan garam yang sama seperti yang disarankan oleh jawaban lain, atau tambahkan opsi nosalt sebagai berikut:

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

Anda dapat melihat ciphertext dalam hex menggunakan xxd

xxd encrypted.bin
person Shaboti    schedule 27.03.2019