Tài liệu Shadowsocks

AEAD

AEAD là viết tắt của Mã hóa xác thực với dữ liệu được liên kết. Mật mã AEAD đồng thời cung cấp tính bảo mật, tính toàn vẹn và tính xác thực. Họ có hiệu suất tuyệt vời và hiệu quả năng lượng trên phần cứng hiện đại. Người dùng nên sử dụng mật mã AEAD bất cứ khi nào có thể.

Các mật mã AEAD sau đây được khuyến nghị. Việc triển khai Shadowsocks tuân thủ phải hỗ trợ AEAD_CHACHA20_POLY1305. Việc triển khai cho các thiết bị có khả năng tăng tốc AES phần cứng cũng nên triển khai AEAD_AES_128_GCM và AEAD_AES_256_GCM.

 

 

 

Họ tên

tên giả

Kích thước khóa

Kích thước muối

kích thước nonce

Kích thước thẻ

AEAD_CHACHA20_POLY1305

chacha20-ietf-poly1305

32

32

12

16

AEAD_AES_256_GCM

aes-256-gcm

32

32

12

16

AEAD_AES_128_GCM

aes-128-gcm

16

16

12

16

Vui lòng tham khảo trước Cơ quan đăng ký IANA AEAD cho sơ đồ đặt tên và đặc điểm kỹ thuật.

Dẫn xuất chính

Khóa chính có thể được nhập trực tiếp từ người dùng hoặc được tạo từ mật khẩu.

HKDF_SHA1 là một hàm lấy khóa bí mật, muối không bí mật, chuỗi thông tin và tạo khóa con mạnh về mặt mật mã ngay cả khi khóa bí mật đầu vào yếu.

HKDF_SHA1(khóa, muối, thông tin) => khóa con

Chuỗi thông tin liên kết khóa con được tạo với ngữ cảnh ứng dụng cụ thể. Trong trường hợp của chúng tôi, nó phải là chuỗi “ss-subkey” không có dấu ngoặc kép.

Chúng tôi lấy khóa con mỗi phiên từ khóa chính được chia sẻ trước bằng cách sử dụng HKDF_SHA1. Muối phải là duy nhất trong toàn bộ vòng đời của khóa chính được chia sẻ trước.

Mã hóa/Giải mã được xác thực

AE_encrypt là một chức năng lấy khóa bí mật, nonce không bí mật, tin nhắn và tạo ra bản mã và thẻ xác thực. Nonce phải là duy nhất cho một khóa nhất định trong mỗi lần gọi.

AE_encrypt(khóa, nonce, tin nhắn) => (bản mã, thẻ)

 

AE_decrypt là một hàm lấy khóa bí mật, nonce không bí mật, bản mã, thẻ xác thực và tạo ra một thông báo gốc. Nếu bất kỳ đầu vào nào bị giả mạo, quá trình giải mã sẽ không thành công.

AE_decrypt(key, nonce, ciphertext, tag) => tin nhắn

TCP

Luồng TCP được mã hóa AEAD bắt đầu bằng một loại muối được tạo ngẫu nhiên để lấy khóa con mỗi phiên, theo sau là bất kỳ số lượng khối được mã hóa nào. Mỗi chunk có cấu trúc như sau:

[độ dài tải trọng được mã hóa][thẻ độ dài][tải trọng được mã hóa][thẻ tải trọng]

 

Độ dài tải trọng là một số nguyên không dấu big-endian 2 byte được giới hạn ở 0x3FFF. Hai bit cao hơn được dành riêng và phải được đặt thành 16. Do đó, tải trọng được giới hạn ở 1024*1 – XNUMX byte.

Thao tác mã hóa/giải mã AEAD đầu tiên sử dụng một nonce đếm bắt đầu từ 0. Sau mỗi thao tác mã hóa/giải mã, nonce được tăng thêm một như thể nó là một số nguyên endian nhỏ không dấu. Lưu ý rằng mỗi đoạn TCP liên quan đến hai hoạt động mã hóa/giải mã AEAD: một cho độ dài tải trọng và một cho tải trọng. Do đó, mỗi đoạn tăng nonce hai lần.

TCP

Luồng TCP được mã hóa AEAD bắt đầu bằng một loại muối được tạo ngẫu nhiên để lấy khóa con mỗi phiên, theo sau là bất kỳ số lượng khối được mã hóa nào. Mỗi chunk có cấu trúc như sau:

[độ dài tải trọng được mã hóa][thẻ độ dài][tải trọng được mã hóa][thẻ tải trọng]

 

Độ dài tải trọng là một số nguyên không dấu big-endian 2 byte được giới hạn ở 0x3FFF. Hai bit cao hơn được dành riêng và phải được đặt thành 16. Do đó, tải trọng được giới hạn ở 1024*1 – XNUMX byte.

Thao tác mã hóa/giải mã AEAD đầu tiên sử dụng một nonce đếm bắt đầu từ 0. Sau mỗi thao tác mã hóa/giải mã, nonce được tăng thêm một như thể nó là một số nguyên endian nhỏ không dấu. Lưu ý rằng mỗi đoạn TCP liên quan đến hai hoạt động mã hóa/giải mã AEAD: một cho độ dài tải trọng và một cho tải trọng. Do đó, mỗi đoạn tăng nonce hai lần.

Bắt đầu dùng thử miễn phí 5 ngày của bạn