2016-10-30 19 views
5

Tôi đã viết đoạn mã sau để giải mã một tập tin:kết quả khác nhau khi giải mã tập tin trong Go và OpenSSL

data, err := ioutil.ReadFile("file.encrypted") 
if err != nil { 
    log.Fatal(err) 
} 

block, err := aes.NewCipher(key) 
if err != nil { 
    log.Fatal(err) 
} 

mode := cipher.NewCBCDecrypter(block, iv) 

mode.CryptBlocks(data, data) 

err = ioutil.WriteFile("file.decrypted", data, 0644) 
if err != nil { 
    log.Fatal(err) 
} 

Tôi cũng đã giải mã các tập tin sử dụng OpenSSL:

openssl aes-128-cbc -d -in file.encrypted -out file.decrypted -iv $IV -K $KEY 

tập tin đầu ra từ Go chương trình lớn hơn 8 byte so với tệp đầu ra từ OpenSSL.

Tail của hexdump từ tập tin được tạo ra bởi OpenSSL:

ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 
ff ff ff ff ff ff ff ff       |........| 

Tail của hexdump từ tập tin được tạo ra bởi chương trình Go:

ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 
ff ff ff ff ff ff ff ff 08 08 08 08 08 08 08 08 |................| 

Tại sao 08 08 08 08 08 08 08 08 nối vào tập tin đầu ra từ chương trình Go?

EDIT:

Như BJ Đen giải thích, lý do cho byte thêm sản lượng từ chương trình Go tôi là PKCS đệm.

Tệp được mã hóa với AES ở chế độ CBC và do đó đầu vào văn bản thuần túy phải là bội số của kích thước khối, phần đệm được thêm vào để đáp ứng yêu cầu này. AES có kích thước khối là 16 byte để tổng số byte đệm sẽ luôn nằm trong khoảng từ 1 đến 16 byte. Mỗi byte đệm có giá trị bằng tổng số byte đệm trong trường hợp của tôi là 0x08.

Vì vậy, để tìm hiểu số lượng đệm thêm vào tập tin, người ta chỉ cần phải đọc các byte cuối cùng của tập tin giải mã và chuyển đổi số đó để int:

paddingBytes := int(data[len(data)-1]) 

Chức năng WriteFile sau đó có thể được sửa đổi như thế này:

err = ioutil.WriteFile("file.decrypted", data[:len(data)-paddingBytes], 0644) 

Kết quả đầu ra từ chương trình Go của tôi giống với đầu ra từ OpenSSL.

+0

Xin chào John Smith, chào mừng bạn đến với Stack Overflow. Cảm ơn bạn đã đóng góp. Nếu bạn có câu trả lời cho câu hỏi của riêng mình hoặc muốn mở rộng câu trả lời cho câu hỏi, vui lòng làm như vậy trong phần trả lời bên dưới. Điều này cho phép người dùng khác dễ dàng điều hướng giữa các câu hỏi và câu trả lời thay vì phải phân tích cú pháp văn bản để tìm hiểu xem họ đang xem cái nào. –

Trả lời

3

Điều bạn đang thấy là vùng đệm PKCS mà OSSL đang xóa cho bạn và Tìm kiếm không theo mặc định. Xem bài đăng Reddit có liên quan here.

Về cơ bản, hãy làm theo ví dụ và bạn tốt để đi.

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