ChaCha20-Poly1305
Last updated
Was this helpful?
Last updated
Was this helpful?
Thuật toán mã dòng ChaCha20, quá trình mã hóa của nó được mô tả như trong Hình 1.
Đầu vào của ChaCha20 bao gồm các thông số sau: 128 bit hằng số, 256 bit khóa, 32 bit bộ đếm khởi tạo có thể thiết lập bằng bất cứ giá trị nào nhưng thường là 0 hoặc 1, 96 bit nonce, bản rõ có chiều dài tùy ý. Đầu ra của ChaCha20 là bản mã có độ dài bằng độ dài bản rõ.
Thuật toán ChaCha20 sử dụng các hàm khối ChaCha20 để tạo dòng khóa mã hóa
Đầu vào của hàm khối ChaCha20 là matrix 4x4 trong hình 2.a
bao gồm
128 bit hằng số C
256 bit khóa K
32 bit tham số bộ đếm Ctr
96 bit nonce N
Thực hiện 20 vòng lặp luân phiên thực thi các biến đổi dịch vòng cột (column round) theo hình 2.b
, dịch vòng chéo(diagonal round) theo hình 2.c
Hai phép biến đổi dịch vòng này được thực thi chỉ nhờ một phép biến đổi QUARTERROUND (dịch vòng chéo hay cột dựa trên chỉ số đầu vào cho hàm QUARTERROUND) theo Hình 3.
Trong 20 vòng lặp, mỗi vòng thực hiện 8 phép QUARTERROUND và thứ tự thực hiện như sau:
QUARTERROUND từ 1 đến 4 thực hiện dịch vòng cột
QUARTERROUND từ 5 đến 8 thực hiện dịch vòng chéo
Đầu ra khối 20 vòng là 16 word, tiến hành cộng với 16 word đầu vào theo modulo 232 để sinh 16 word khóa. 16 word khóa cộng XOR với 16 word bản rõ để thu được 16 word bản mã.
Mỗi phép QUARTERROUND được mô tả như sau:
Bản rõ được xử lý trong quá trình mã hóa theo từng 512 bit (16 word), nếu bản rõ có độ dài không là bội số của 512 thì sẽ được đệm thêm các bit 0 ở cuối. Thuật toán ChaCha20 thực hiện gọi liên tiếp hàm khối ChaCha20 với cùng khóa, giá trị nonce và các tham số bộ đếm tăng liên tiếp, sau đó xếp tuần tự trạng thái kết quả tạo một dòng khóa có kích cỡ lớn hơn hoặc bằng với kích cỡ bản rõ. Phép mã hóa thực hiện XOR khóa dòng với bản rõ để tạo ra bản mã. Quá trình giải mã được thực hiện một bằng cách tương tự với đầu vào bản mã thay thế cho bản rõ.
Poly1305 là cơ chế xác thực thông báo với đầu vào khóa 256 bit và thông báo có độ dài không cố định, đầu ra là một thẻ xác thực độ dài 128 bit [2][3]. Thẻ xác thực này được bên nhận dùng để xác thực nguồn gốc thông báo.
Khóa đầu vào được chia thành 2 phần được gọi là r và s, mỗi phần có độ dài 128 bit. Cặp (r,s) phải là duy nhất và không thể đoán được cho mỗi lần gọi. r cần được xử lý bằng cách XOR với 0x0ffffffc0ffffffc0ffffffc0fffffff
(r).
Thông báo đầu vào được chia thành các khối 16 byte (khối cuối cùng có thể ngắn hơn và sẽ được thêm các bit 0), các khối 16 byte được đệm thêm vào 1 byte có giá trị 0x01 thành 17 byte, các phép tính được thực hiện trên các khối này với r trên trường Z () để tạo một bộ tích lũy ACC như Hình 4.
Cuối cùng giá trị s được thêm vào bộ tích lũy và 128 bit được lấy ra làm thẻ xác thực (Hình 5).
ChaCha20-Poly1305 là hệ mã dòng có xác thực thông qua việc thực thi thuật toán mã dòng ChaCha20 trong cơ chế xác thực Poly1305.
Đầu vào của hệ mã dòng này là một khóa K dài 256 bit, một giá trị nonce N dài 96 bit, dữ liệu liên kết A có độ dài tùy ý, thông báo M có độ dài tùy ý.
Đầu ra gồm 2 thành phần là bản mã C có cùng độ dài với bản rõ và thẻ xác thực T độ dài 128 bit.
Quá trình mã hóa ChaCha20-Poly1305 được mô tả trong Hình 6 [3]
Khóa dòng được sinh trong ChaCha20-Poly1305 bằng cách thực thi các hàm khối ChaCha20 với khóa K, giá trị nonce N và bộ đếm khởi tạo ban đầu có giá trị bằng 1. Khóa dòng sau đó được cộng XOR với bản rõ để tạo bản mã C.
Thẻ xác thực được tính bởi cơ chế Poly1305 với khóa đầu vào là 256 bit đầu tiên, dữ liệu liên kết A, bản mã C và độ dài của A và C. Khóa đầu vào được tính bởi hàm khối ChaCha20 với khóa K, nonce N, bộ đếm có giá trị bằng 0 và được cắt còn 256 bit.
Porcter đã chứng minh rằng ChaCha20-Po-ly1305 an toàn nếu cả ChaCha20 và Poly1305 đều an toàn [3].