EdDSA là thuật toán chữ ký số tiên tiến sử dụng các đường cong Edwards, được thiết kế nhằm cung cấp hiệu suất cao và tính bảo mật mạnh mẽ.
Giới thiệu
Bài viết này mô tả cách tạo và xác minh chữ ký tương thích với EdDSA bằng cách sử dụng định dạng khóa công khai và khóa riêng ban đầu được xác định cho các hàm Diffie – Hellman đường cong elliptic X25519 và X448. Signal gọi đây là sơ đồ chữ ký XEdDSA (hoặc XEd25519 hoặc XEd448 đối với các đường cong cụ thể).
EdDSA là thuật toán chữ ký số tiên tiến sử dụng các đường cong Edwards, được thiết kế nhằm cung cấp hiệu suất cao và tính bảo mật mạnh mẽ. So sánh với các thuật toán chữ ký truyền thống như RSA, EdDSA mang đến nhiều lợi thế đáng kể như tốc độ ký và xác minh nhanh chóng, kích thước chữ ký nhỏ gọn và khả năng chống lại các cuộc tấn công bên kênh. Nguyên lý hoạt động của thuật toán dựa trên việc sử dụng các đường cong elliptic đặc biệt (đường cong Edwards), cho phép tạo ra các chữ ký số an toàn và hiệu quả.
Ứng dụng của EdDSA rộng rãi trong các hệ thống an ninh mạng, giao thức blockchain, hệ thống thanh toán điện tử và các ứng dụng yêu cầu xác thực cao. Các nền tảng như Bitcoin, Ethereum và nhiều hệ thống mã hóa khác đã áp dụng EdDSA để tăng cường tính bảo mật và hiệu quả của quá trình xác thực điện tử. Ưu điểm nổi bật của thuật toán là khả năng tạo ra các chữ ký số nhanh chóng, an toàn và chiếm dụng ít tài nguyên tính toán.
XEdDSA cho phép sử dụng một định dạng cặp khóa duy nhất cho cả Diffie – Hellman đường cong elliptic và chữ ký. Trong một số trường hợp, nó cho phép sử dụng cùng một cặp khóa cho cả hai thuật toán.
Bài viết này cũng mô tả VXEdDSA, một phần mở rộng của XEdDSA giúp nó trở thành một hàm ngẫu nhiên có thể xác minh được (verifiable random function – VRF, như được định nghĩa trong và). Việc xác minh thành công một chữ ký VXEdDSA sẽ trả về một đầu ra VRF được đảm bảo là duy nhất cho thông điệp và khóa công khai. Đầu ra VRF cho một thông điệp và khóa công khai nhất định không thể phân biệt được với một giá trị ngẫu nhiên đối với bất kỳ ai chưa từng thấy chữ ký VXEdDSA của thông điệp và khóa đó.
Kiến thức cơ bản
Ký hiệu
Phép nhân hai số nguyên a và b theo modulo số nguyên tố p được ký hiệu là ab (mod p), hoặc a b (mod p). Phép chia được ký hiệu là a/b (mod p) và được tính bằng công thức ab⁻¹ (mod p).
Hàm inv(a) (mod p) được định nghĩa để trả về a⁻¹ (mod p) khi a khác 0, và trả về 0 khi a bằng 0. Điều này có thể được tính bằng công thức inv(a) = a^(p – 2) (mod p), theo định lý Fermat.
Hàm ceil và floor lần lượt làm tròn lên hoặc làm tròn xuống đến số nguyên gần nhất.
Phép cộng và trừ giữa hai điểm A và B trên đường cong elliptic được ký hiệu là A + B và A – B. Phép nhân vô hướng (scalar multiplication) của một số nguyên a với một điểm đường cong elliptic B sẽ tạo ra một điểm mới C = aB.
Các biến số nguyên được viết thường (x, y). Các điểm và biến khác được viết hoa (P, Q). Các hằng số nguyên được viết thường ngoại trừ hằng số A của đường cong Montgomery, theo quy ước.
Chuỗi byte được viết in đậm (x, P). Một số nguyên in đậm hoặc một điểm đường cong elliptic biểu thị một chuỗi byte có độ dài cố định mã hóa giá trị của nó.
Phép nối chuỗi byte x và P được ký hiệu là x || P.
Việc kiểm tra hai số nguyên hoặc hai điểm có bằng nhau không được thực hiện bằng biểu thức a == b. Việc kiểm tra hai chuỗi byte có bằng nhau không được thực hiện bằng bytes_equal(X, Y).
Thông số đường cong Elliptic
Một đường cong elliptic được sử dụng với XEdDSA hoặc VXEdDSA có các thông số sau:
– B: Điểm cơ sở (Base point).
– I: Điểm đơn vị (Identity point).
– p: Số nguyên tố trường (Field prime).
– q: Bậc của điểm cơ sở (số nguyên tố; q < p; qB = I).
– c: Hệ số (Cofactor).
– d: Hằng số đường cong Edwards xoắn (Twisted Edwards curve constant).
– A: Hằng số đường cong Montgomery (Montgomery curve constant).
– n: Số nguyên không phải là bình phương theo modulo p.
– p: ceil(log₂(p)).
– q: ceil(log₂(q)).
– b: 8 (ceil((|p| + 1)/8)) (= độ dài bit cho điểm hoặc số nguyên được mã hóa).
Một số nguyên theo modulo p được gọi là phần tử trường (field element). Một số nguyên theo modulo q được gọi là số vô hướng (scalar).
Một đường cong elliptic là một tập hợp các cặp phần tử trường. Mỗi cặp là một điểm, các phần tử trường trong một điểm là tọa độ, và tọa độ của mỗi điểm phải thỏa mãn một phương trình xác định đường cong.
Hàm on_curve(P) trả về true nếu điểm P thỏa mãn phương trình đường cong.
Đường cong elliptic cũng định nghĩa một phép cộng giữa các điểm và một phép lấy đối điểm (negation). Cùng với điểm đơn vị, các phép toán này tạo thành một cấu trúc nhóm trên các điểm của đường cong. Cộng một điểm P với chính nó k lần (P + P + P + …) chính là phép nhân vô hướng với k, ký hiệu là kP.
XEdDSA và VXEdDSA được định nghĩa trên các đường cong Edwards xoắn (twisted Edwards curves), trong đó các điểm được ký hiệu là (x, y). Một đường cong Edwards xoắn tương đương song hữu tỷ với một đường cong Montgomery (Montgomery curve), trong đó các điểm được ký hiệu là (u, v).
Signal chủ yếu làm việc với đường cong Edwards xoắn, vì vậy khi đề cập đến điểm cơ sở B và điểm đơn vị I, Signal đang nói về các điểm trên đường cong Edwards xoắn.
Hàm u_to_y áp dụng một phép biến đổi song hữu tỷ (birational map) cụ thể cho đường cong để chuyển đổi tọa độ u của một điểm trên đường cong Montgomery thành tọa độ y của điểm tương đương trên đường cong Edwards xoắn.
Chuyển đổi đường cong Elliptic
Phép tính Diffie – Hellman trên đường cong elliptic thường được thực hiện bằng phương pháp Montgomery ladder. Cách tiếp cận này cung cấp một phép tính đơn giản và hiệu quả, đồng thời có khả năng chống lại các kênh rò rỉ thời gian một cách tự nhiên.
Montgomery ladder cũng cho phép khóa công khai của mỗi bên là một tọa độ u trên đường cong Montgomery. Việc sử dụng một tọa độ duy nhất thay vì toàn bộ điểm giúp giảm kích thước khóa công khai mà không cần đến quá trình giải mã điểm.
Tuy nhiên, chữ ký EdDSA được định nghĩa trên các đường cong Edwards xoắn, trong đó một khóa công khai là một điểm nén bao gồm tọa độ y trên đường cong Edwards xoắn và một bit dấu s có giá trị 0 hoặc 1. Tọa độ y trên đường cong Edwards xoắn và bit dấu cung cấp một biểu diễn thay thế của một điểm trên đường cong Edwards xoắn, đồng thời xác định tọa độ x theo quy tắc trong hoặc.
Chuyển đổi từ một tọa độ u trên đường cong Montgomery sang một điểm P trên đường cong Edwards xoắn có thể được thực hiện bằng hàm convert_mont dưới đây. Hàm này trước tiên loại bỏ các bit cao dư thừa khỏi u, đây là một thực hành tiêu chuẩn đối với các khóa công khai Montgomery Curve25519 và được quy định trong. Sau đó, hàm áp dụng phép biến đổi song hữu tỷ đặc trưng của đường cong để tính toán tọa độ y trên đường cong Edwards xoắn, cuối cùng chọn bit dấu là 0.
convert_mont(u):
umasked = u (mod 2|p|)
P.y = u_to_y(umasked)
P.s = 0
return P
Do convert_mont không có giá trị v của đường cong Montgomery, nên nó không thể phân biệt được hai khả năng khác nhau của bit dấu trên đường cong Edwards xoắn. Việc ép bit dấu về 0 là một ý tưởng từ Jivsov.
Để làm cho khóa riêng tương thích với phép chuyển đổi này, Signal định nghĩa khóa riêng trên đường cong Edwards xoắn là một số vô hướng a, trong đó khóa công khai trên đường cong Edwards xoắn A = aB có bit dấu bằng 0 (nhớ rằng B là điểm cơ sở trên đường cong Edwards xoắn). Đối với khóa riêng trên đường cong Montgomery, Signal cho phép nó là bất kỳ số vô hướng nào.
Chuyển đổi một khóa riêng k trên đường cong Montgomery thành một khóa công khai và khóa riêng trên đường cong Edwards xoắn (A, a) có thể được thực hiện bằng hàm calculate_key_pair (ở đây A là khóa công khai, không phải hằng số của đường cong Montgomery). Hàm này nhân khóa riêng Montgomery k với điểm cơ sở B trên đường cong Edwards xoắn, sau đó điều chỉnh khóa riêng nếu cần để đảm bảo bit dấu bằng 0, theo phương pháp trong.
calculate_key_pair(k):
E = kB
A.y = E.y
A.s = 0
if E.s == 1:
a = – k (mod q)
else:
a = k (mod q)
return A, a
Chuỗi byte
Một số nguyên được viết in đậm biểu thị một chuỗi byte dài b bit, mã hóa số nguyên theo dạng little – endian. Một điểm trên đường cong elliptic được viết in đậm (Ví dụ P) mã hóa tọa độ P.y dưới dạng số nguyên theo little – endian với độ dài b – 1 bit, sau đó thêm một bit để lưu trữ giá trị P.s.
Hàm băm
XEdDSA và VXEdDSA yêu cầu một hàm băm mật mã. Hàm băm mặc định là SHA512.
Signal định nghĩa hash là một hàm áp dụng thuật toán băm mật mã lên một chuỗi byte đầu vào, và trả về một số nguyên là kết quả của hàm băm được phân tích dưới dạng little – endian.
Dựa vào hash và các hằng số của đường cong p và b, Signal định nghĩa một họ các hàm băm được đánh số bởi các số nguyên không âm i, sao cho 2|p| – 1 – i > p.
hashi(X):
return hash(2b – 1 – i || X)
Vì vậy, hash0 băm một chuỗi gồm b/8 byte có giá trị 0xFF trước chuỗi byte đầu vào X, hash1 thay đổi byte đầu tiên thành 0xFE, hash2 thay đổi byte đầu tiên thành 0xFD,…
Các hàm hashi khác nhau sẽ được sử dụng cho các mục đích khác nhau nhằm cung cấp khả năng phân tách miền mật mã. Lưu ý rằng hashi sẽ không bao giờ gọi hàm hash với b bit đầu tiên mã hóa một số vô hướng hợp lệ hoặc một điểm trên đường cong elliptic, vì |p| bit đầu tiên mã hóa một số nguyên lớn hơn p. Ngoài ra, hash0 được dành cho các đặc tả khác và không được sử dụng trong Bài viết này.
Hàm băm thành điểm với Elligator 2
VXEdDSA yêu cầu ánh xạ một thông điệp đầu vào thành một điểm trên đường cong elliptic, được thực hiện bằng ánh xạ Elligator 2.
Mô tả trong ngắn gọn và sử dụng ký hiệu khác, vì vậy Signal sẽ tóm tắt phương pháp Elligator 2. Phương trình đường cong Montgomery đối với các điểm (u, v) là:
(u, v) is v2 = u(u2 + Au + 1) (mod p)
trong đó A là một hằng số cụ thể của đường cong.
Elligator 2 ánh xạ một số nguyên r thành một giá trị u, sao cho u(u² + Au + 1) có căn bậc hai v theo modulo p.
Hàm elligator2 thực hiện ánh xạ từ một số nguyên r sang một số nguyên u.
elligator2(r):
u1 = – A inv(1 + nr²) (mod p)
w1 = u1(u1² + Au1 + 1) (mod p)
if w1^(p – 1)/2 == – 1 (mod p):
u2 = – A – u1 (mod p)
return u2
return u1
(Hàm inv được sử dụng một cách an toàn, vì nếu gọi inv(0) khi r² = – 1/n, thì nó chỉ ánh xạ r đến u = 0, là một tọa độ u hợp lệ trên đường cong Montgomery.)
Để ánh xạ một chuỗi byte thành một điểm trên đường cong Edwards, Signal băm chuỗi byte đó và phân tích đầu ra của hàm băm để lấy một phần tử trường r và một bit dấu s.
Hàm Elligator 2 chuyển đổi r thành một tọa độ u trên đường cong Montgomery. Phép biến đổi song hữu tỷ chuyển đổi tọa độ u trên đường cong Montgomery thành một điểm trên đường cong Edwards.
Cuối cùng, Signal nhân điểm trên đường cong Edwards với hệ số c để đảm bảo rằng điểm đó thuộc về tập con bậc q được tạo ra bởi điểm cơ sở B.
Hàm hash to point thực hiện các bước này.
hash_to_point(X):
h = hash2(X)
r = h (mod 2|p|)
s = floor((h mod 2b) / 2b – 1)
u = elligator2(r)
P.y = u_to_y(u)
P.s = s
return cP
XEdDSA
Thuật toán ký XEdDSA yêu cầu các đầu vào sau:
Tên | Định nghĩa |
---|---|
k | Khóa riêng Montgomery (số nguyên theo modulo q). |
M | Thông điệp cần ký (chuỗi byte). |
Z | 64 byte dữ liệu ngẫu nhiên bảo mật (chuỗi byte). |
Đầu ra của thuật toán là một chữ ký (R || s), một chuỗi byte có độ dài 2b bit, trong đó R mã hóa một điểm và s mã hóa một số nguyên theo modulo q.
Thuật toán xác minh XEdDSA yêu cầu các đầu vào sau:
– u: Khóa công khai Montgomery (chuỗi byte có độ dài b bit).
– M: Thông điệp cần xác minh (chuỗi byte).
– (R || s): Chữ ký cần xác minh (chuỗi byte có độ dài 2b bit).
Nếu xác minh XEdDSA thành công, thuật toán trả về true; ngược lại, thuật toán trả về false. Dưới đây là mã giả cho các hàm xeddsa_sign và xeddsa_verify.
xeddsa_sign(k, M, Z):
A, a = calculate_key_pair(k)
r = hash1(a || M || Z) (mod q)
R = rB
h = hash(R || A || M) (mod q)
s = r + ha (mod q)
return R || s
và:
xeddsa_verify(u, M, (R || s)):
if u >= p or R.y >= 2|p| or s >= 2|q|:
return false
A = convert_mont(u)
if not on_curve(A):
return false
h = hash(R || A || M) (mod q)
Rcheck = sB – hA
if bytes_equal(R, Rcheck):
return true
return false
VXEdDSA
Thuật toán ký VXEdDSA có các đầu vào giống như XEdDSA. Đầu ra gồm một cặp giá trị.
Thứ nhất, chữ ký (V || h || s), một chuỗi byte có độ dài 3b bit, trong đó V mã hóa một điểm và h cùng s mã hóa các số nguyên theo modulo q.
Thứ hai, một chuỗi byte đầu ra VRF v có độ dài b bit, được tạo bằng cách nhân đầu ra V với hệ số c.
Thuật toán xác minh VXEdDSA có các đầu vào giống như XEdDSA, ngoại trừ chữ ký VXEdDSA thay vì chữ ký XEdDSA. Nếu xác minh VXEdDSA thành công, thuật toán trả về một chuỗi byte đầu ra VRF v có độ dài b bit; ngược lại, thuật toán trả về false.
Dưới đây là mã giả cho các hàm vxeddsa_sign và vxeddsa_verify.
vxeddsa_sign(k, M, Z):
A, a = calculate_key_pair(k)
Bv = hash_to_point(A || M)
V = aBv
r = hash3(a || V || Z) (mod q)
R = rB
Rv = rBv
h = hash4(A || V || R || Rv || M) (mod q)
s = r + ha (mod q)
v = hash5(cV) (mod 2b)
return (V || h || s), v
và:
vxeddsa_verify(u, M, (V || h || s)):
if u >= p or V.y >= 2|p| or h >= 2|q| or s >= 2|q|:
return false
A = convert_mont(u)
Bv = hash_to_point(A || M)
if not on_curve(A) or not on_curve(V):
return false
if cA == I or cV == I or Bv == I:
return false
R = sB – hA
Rv = sBv – hV
hcheck = hash4(A || V || R || Rv || M) (mod q)
if bytes_equal(h, hcheck):
v = hash5(cV) (mod 2b)
return v
return false
Curve25519
Đường cong elliptic Curve25519 được quy định trong có thể được sử dụng với XEdDSA và VXEdDSA, tạo thành XEd25519 và VXEd25519. Đường cong này xác định các tham số sau:
– B: convert_mont(9).
– I: (x=0, y=1).
– p: 2²⁵⁵ – 19.
– q: 2²⁵² + 27742317777372353535851937790883648493.
– c: 8.
– d: – 121665 / 121666 (mod p).
– A: 486662.
– n: 2.
– |p|: 255.
– |q|: 253.
– b: 256.
Phương trình đường cong Edwards xoắn là:
– x² + y² = 1 + dx²y²
Hàm u to y thực hiện phép biến đổi song hữu tỷ từ bằng cách tính toán:
y = (u – 1) * inv(u + 1) (mod p)
Chữ ký XEd25519 là chữ ký Ed25519 hợp lệ và ngược lại, với điều kiện khóa công khai được chuyển đổi bằng phép biến đổi song hữu tỷ.
Ed25519 cho phép các triển khai có một số linh hoạt trong việc chấp nhận hoặc từ chối một số chữ ký không hợp lệ nhất định (Ví dụ: chữ ký với s chưa được giảm, hoặc kiểm tra phương trình xác minh có hoặc không nhân hệ số c).
XEdDSA quy định chính xác quy trình xác minh, vì vậy có thể có sự khác biệt với một số triển khai Ed25519 trong việc chấp nhận hoặc từ chối các chữ ký như vậy (tương tự như cách một số triển khai Ed25519 có thể khác nhau).
Các bước xác minh cụ thể được chọn trong XEdDSA bao gồm việc từ chối s nếu nó có các bit dư thừa nhưng không yêu cầu nó phải được giảm hoàn toàn, và kiểm tra xác minh mà không cần nhân hệ số c.
Những lựa chọn này phù hợp với mã Ed25519 hiện có và dẫn đến các triển khai đơn giản hơn.
Curve448
Đường cong elliptic Curve448 được quy định trong có thể được sử dụng với XEdDSA và VXEdDSA, tạo thành XEd448 và VXEd448. Đường cong này xác định các tham số sau:
– B: convert_mont(5).
– I: (x=0, y=1).
– p: 2⁴⁴⁸ – 2²²⁴ – 1.
– q: 2⁴⁴⁶ – 13818066809895115352007386748515426880336692474882178609894547503885.
– c: 4.
– d: 39082 / 39081 (mod p).
– A: 156326.
– n: – 1.
– |p: 448.
– |q: 446.
– b: 456.
Phương trình đường cong Edwards xoắn là:
x² + y² = 1 + dx²y²
Hàm u to y thực hiện phép biến đổi song hữu tỷ từ bằng cách tính toán:
y = (1 + u) * inv(1 – u) (mod p)
XEd448 khác với EdDSA trong việc lựa chọn hàm băm. XEd448 sử dụng SHA512, trong khi khuyến nghị sử dụng hàm băm có độ dài 912 bit (912 = 2b). Nếu hàm băm là bảo mật, thì các đầu ra có độ dài lớn hơn 512 bit không làm tăng mức độ bảo mật với Curve448, vì vậy XEd448 chọn phương pháp đơn giản hơn.
XEd448 có thể khác với một số phương án triển khai EdDSA khác được đề xuất trong, những phương án này sử dụng đường cong 4 – isogenous từ thay vì đường cong birationally equivalent. Việc ánh xạ từ dạng Montgomery của Curve448 sang đường cong isogenous phức tạp hơn.
Các yếu tố ảnh hưởng đến hiệu suất
Phần này chứa danh sách chưa đầy đủ về các yếu tố ảnh hưởng đến hiệu suất.
Ký nhanh hơn: Việc gọi calculate_key_pair cho mỗi chữ ký XEdDSA làm tăng gấp đôi thời gian ký so với EdDSA, vì calculate_key_pair thực hiện thêm một phép nhân vô hướng E = kB. Ký VXEdDSA tốn kém hơn, vì vậy tác động này giảm tỷ lệ tương ứng. Để tránh chi phí này, bên ký có thể lưu vào bộ nhớ đệm điểm E (không phải bí mật).
Tiền băm: Ngoại trừ xác minh XEdDSA, các thuật toán ký và xác minh đều băm thông điệp đầu vào hai lần. Đối với các thông điệp lớn, điều này có thể tốn kém, đồng thời yêu cầu bộ đệm lớn hoặc API phức tạp hơn.
Để ngăn chặn điều này, các API có thể quy định một kích thước thông điệp tối đa mà tất cả các triển khai phải có khả năng lưu trữ trong bộ nhớ. Các nhà thiết kế giao thức có thể quy định tiền băm các trường thông điệp để phù hợp với giới hạn này. Họ được khuyến khích sử dụng tiền băm một cách có chọn lọc để hạn chế tác động tiềm tàng từ các cuộc tấn công va chạm, ví dụ: tiền băm các tệp đính kèm của một thông điệp nhưng không tiền băm tiêu đề hoặc nội dung chính của thông điệp.
Các yếu tố ảnh hưởng đến bảo mật
Phần này chứa danh sách chưa đầy đủ về các yếu tố ảnh hưởng đến bảo mật.
Các đầu vào bí mật ngẫu nhiên: Chữ ký XEdDSA và VXEdDSA là chữ ký ngẫu nhiên, không phải chữ ký xác định theo nghĩa của hoặc. Người gọi phải cung cấp một giá trị bí mật ngẫu nhiên 64 byte mới mỗi khi gọi hàm ký.
Chữ ký xác định được thiết kế để ngăn chặn việc tái sử dụng cùng một nonce (r) với các thông điệp khác nhau, vì điều này có thể làm lộ khóa riêng a. Xét hai chữ ký XEdDSA (R || s₁) và (R || s₂) với:
s₁ = r + h₁a \mod q
s₂ = r + h₂a \mod q
Khóa riêng a có thể được tính bằng:
a = \frac{s₁ – s₂}{h₁ – h₂} \mod q
Một sơ đồ ký xác định sẽ băm M cùng với một bí mật dài hạn để tính r, thay vì lấy r từ một bộ tạo số ngẫu nhiên. Vì M cũng được băm để tính h, xác suất các giá trị h khác nhau nhận cùng một r là rất nhỏ. Tuy nhiên, nếu cùng một thông điệp được ký nhiều lần, một lỗi trong quá trình tính toán h có thể khiến điều này xảy ra (theo quan sát của Benedikt Schmidt). Ngoài ra, việc sử dụng lại r có thể giúp kẻ tấn công thu thập thông tin về r thông qua phân tích kênh bên.
Vì vậy, XEdDSA và VXEdDSA duy trì ý tưởng tính r bằng cách băm một khóa bí mật dài hạn và thông điệp, nhưng bổ sung thêm một giá trị ngẫu nhiên vào tính toán để tăng độ bền vững.
Thời gian thực thi cố định: Các thuật toán ký không được thực hiện các truy cập bộ nhớ khác nhau hoặc mất thời gian khác nhau tùy thuộc vào thông tin bí mật. Điều này thường được đảm bảo bằng cách triển khai thời gian thực thi cố định, trong đó các lệnh và truy cập bộ nhớ được thực thi theo một trình tự cố định, bất kể khóa bí mật hoặc nội dung thông điệp.
Cần đặc biệt chú ý đến hàm calculate_key_pair do việc sử dụng câu lệnh rẽ nhánh có điều kiện. Hàm hash_to_point cũng sử dụng rẽ nhánh có điều kiện (trong elligator2) và nên được thực hiện theo thời gian thực thi cố định, mặc dù nó chỉ xử lý thông điệp mà không liên quan đến khóa bí mật.
Tái sử dụng khóa: Việc sử dụng cùng một cặp khóa để tạo chữ ký XEdDSA và VXEdDSA là an toàn.
Về lý thuyết, trong một số trường hợp nhất định, có thể sử dụng một cặp khóa vừa để tạo chữ ký vừa để sử dụng trong một số giao thức dựa trên Diffie – Hellman. Tuy nhiên, trên thực tế, đây là một chủ đề phức tạp, đòi hỏi phân tích cẩn thận và nằm ngoài phạm vi của Bài viết này.

- lap-trinh
- bao-mat
- mat-ma-hoc
- signal-protocol
- ma-hoa-thong-tin
- bao-mat-thong-tin
- double-ratchet
- kdf
- eddsa
- xed25519
- xed448
- forward-secrecy
- future-secrecy
- key-agreement
- key-agreement-protocol
- shared-secret-key
- khoa-bi-mat-chung
- giao-thuc-bao-mat
- giao-thuc-nhan-tin
- ma-hoa-dau-cuoi
- tin-nhan-ma-hoa-dau-cuoi