Đây là một nỗi đau để làm với openssl, bởi vì mã hóa openssl làm cho các giả định về đệm và lấy ra một khóa muối từ mật khẩu đã nhập mà bạn phải cố ý tắt.
Việc làm dễ dàng hơn trong python với số PyCrypto, nơi những giả định này không được thực hiện.
>>> import base64
>>> data = base64.b64decode('y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik=')
>>> from Crypto.Cipher import AES
>>> aes_crypter = AES.new('h4ckth1sk3yp4d16', AES.MODE_CBC, data[:16])
>>> aes_crypter.decrypt(data[16:]) # this gives the encrypted secret.
Có thể làm điều này với openssl, nhưng bạn phải đọc base64 dữ liệu mã hóa - đưa ra 16 byte đầu tiên và ghi nhớ nó như $IV
của bạn (sau khi mã hóa nó trở lại để hex openssl rằng hy vọng) , bắt đầu đọc tất cả các byte sau 16 đầu tiên và ghi nhớ nó là $CIPHERTEXT
(và nói lại mã hóa trong base64). Tương tự cho $KEY
, bạn phải chuyển đổi nó từ ASCII thành byte trong hex. Giả sử bạn lưu trữ chúng vào các biến, sau đó những điều sau đây sẽ làm việc:
IV=`base64 -d part444.txt | xxd -p -l 16`
CIPHERTEXT=`base64 -d part444.txt | cut -b 17- | base64`
KEY=`echo -n h4ckth1sk3yp4d16 |xxd -p`
echo $CIPHERTEXT | openssl aes-128-cbc -d -a -nopad -K $KEY -iv $IV && echo ""
Note base64 -d
giải mã base64 để nhị phân (base64 sử dụng từ coreutils GNU; trên BSD thay thế với base64 -D
), base64
b64 mã hóa dữ liệu nhị phân, cut -b 17-
đọc từ Byte thứ 17 của dữ liệu vào cuối của tập tin, và xxd -p
chuyển đổi nhị phân thành hex.
Nguồn
2016-10-22 04:59:22
Rất nhiều điều cần làm trong tập lệnh trình bao. 'cut -b 16-' có lẽ sẽ giúp cô lập bản mã. – jww
@jww - Vâng, có một chút khó chịu khi thực hiện trong dòng lệnh (vì các lý do như lỗi off-by-one; ví dụ, nên là 'cut -b 17-'), nhưng chắc chắn có thể thực hiện được. –
@jimbob - Thật vậy, cảm ơn! – jww