2016-10-22 36 views
6

tôi đang cố gắng để giải mã một tập tin (part444.txt) với thông điệp:AES128-CBC "xấu số kỳ diệu" và "lỗi khi đọc tập tin đầu vào"

y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik= 

là base64 này mã hóa mã hóa văn bản dưới 128 bit AES trong CBC chế độ. Nó không phải là đệm. IV là 16 byte đầu tiên của văn bản được mã hóa và khóa là h4ckth1sk3yp4d16.

Tôi biết rằng mọi người đã nhận được lỗi số ma thuật xấu từ các sự cố với Base64 nhưng giờ tôi nhận được lỗi "đọc tệp đầu vào" và không chắc chắn nên đi đâu từ đây.

Tôi đã thử:

openssl enc -base64 -d part444.txt | openssl aes-128-cbc -d -k h4ckth1sk3yp4d16 

Tại sao tôi lại gặp phải các lỗi "con số kỳ diệu xấu""lỗi khi đọc tập tin đầu vào"?

Trả lời

6

Đâ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.

+0

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

+1

@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. –

+0

@jimbob - Thật vậy, cảm ơn! – jww

Các vấn đề liên quan