Hàm băm OpenSSL để tạo khóa AES


8

OpenSSL sử dụng chức năng băm nào để tạo khóa cho AES-256? Tôi không thể tìm thấy nó ở bất cứ đâu trong tài liệu của họ.

$ 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

Thuật toán băm nào tạo ra hàm băm không được xếp sau key=dòng cuối cùng thứ hai, cho đầu vào "a"?

Câu trả lời:


9

Chắc chắn đó là thuật toán tiêu hóa SHA1 nhưng thành thật mà nói tôi không thể nói chắc chắn 100%.

Và ai có thể nghĩ rằng một cái gì đó được thiết kế để tăng sự mập mờ sẽ có những hướng dẫn khó hiểu;)

EDIT: Điều này có thể không hữu ích trong hoàn cảnh của bạn nhưng tôi đoán bạn luôn có thể biết bằng cách thực hiện

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

Tôi đã xác định rằng nó sử dụng MD5 theo mặc định, vì khi tôi sử dụng lệnh của bạn (sidenote: không có tùy chọn nào trong số đó được ghi lại trong trang pháp sư ...) md5thay vì sha1, tôi nhận được kết quả giống như tôi đã đăng ban đầu. Câu hỏi là, làm thế nào để nó có được 256 bit từ MD5 (thuật toán băm 128 bit)?
mk12

Một cách điều này được thực hiện là bằng cách ghép hai MD5 khác nhau ở dạng nhị phân dẫn đến khóa 256 bit thực sự. Có một vài phương pháp khác cho việc này là tốt. Bạn có thể kiểm tra gói php "md5_base64". Ngay cả khi bạn không phải là một người php, các tài liệu vẫn có nhiều thông tin.
Snesticle

4

Đó là sự kết hợp của hai hàm băm MD5.

Nó bắt nguồn như thế này:

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

Bạn có thể kiểm tra điều này bằng cách thực hiện:

$ 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

Lưu ý rằng cả MD5 của 'key.128.tmp' và 'key.256.tmp' được ghép với nhau tạo thành cùng một khóa như đầu ra tại lệnh ban đầu.


Và nếu bạn thực hiện lần lặp thứ ba, bạn sẽ nhận được IV. Trường hợp này thuận tiện vì kích thước khóa và dữ liệu = IV (256 và 128 bit) đều là bội số chính xác của đầu ra băm; nói chung, bạn ghép các đầu ra băm và lấy các bit K đầu tiên cho khóa và các bit D tiếp theo cho IV.
dave_thndry_085

cập nhật: mặc định được sử dụng là md5, nhưng kể từ 1.1.0 năm 2016, nó là sha256. Chi tiết đầy đủ tại crypto.stackexchange.com/questions/3298/iêu
dave_thedom_085

2

OpenSSL sử dụng AES với SHA1.

Nếu bạn muốn kiểm tra nguồn được viết tốt hơn OpenSSL, hãy xem bài viết về
lớp C ++ có giao diện với các mật mã OpenSSL .

Bài viết bao gồm mã nguồn rất đơn giản đó là:

cho phép bạn mã hóa và giải mã các tập tin hoặc chuỗi bằng thuật toán mã hóa OpenSSL AES-256-CBC và thuật toán tiêu hóa SHA1. Nó có thể tương thích với công cụ dòng lệnh openssl giúp nó giới thiệu tốt về việc sử dụng OpenSSL cho mật mã.


1

Tôi không biết câu trả lời, nhưng có lẽ bạn có thể tìm thấy nó đủ dễ dàng trong mã nguồn OpenSSL .


2
"Dễ dàng đủ" mainChức năng (nơi có chức năng hỏi mật khẩu) dài ~ 500 dòng và bị vấy bẩn bởi gotos.
mk12

5
Ồ Tôi chỉ nhìn vào mã nguồn. Nó hầu như không thể đọc được. Miễn bình luận. Tên biến một chữ cái. Ừ Tôi xin lỗi tôi đã đề nghị điều đó.
Fran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.