Trong [23], [26] đưa ra các lược đồ sửa đổi bằng cách sử dụng hai khóa bí mật tức thời 𝑘1 và 𝑘2. Ở đây, 𝑎 không thể được xác định dù là lặp lại cùng với các khóa bí mật tức thời (𝑘1, 𝑘2). Các quá trình là phức tạp hơn lược đồ ECDSA thông thường và điều đó làm tăng mức độ an toàn. Giai đoạn sinh cặp khóa là giống như ECDSA.
Thuật toán ký ECDSA - dùng 2 khóa:
Đầu vào: m, a. Đầu ra: (𝑟1, 𝑟2, 𝑠). Bước 1: Chọn 𝑘1, 𝑘2 ∈𝑅 [1, … , 𝑞 − 1]. Bước 2: Tính 𝑅1(𝑥1, 𝑦1) = 𝑘1𝑃; 𝑅2(𝑥2, 𝑦2) = 𝑘2𝑃. Bước 3: Tính 𝑟1 = 𝑥1 𝑚𝑜𝑑 𝑞; 𝑟2 = 𝑥2 𝑚𝑜𝑑 𝑞. Bước 4: Tính ℎ = 𝐻(𝑚). Bước 5: Tính 𝑠 = 𝑘1−1(ℎ𝑘2 + 𝑎(𝑟1+ 𝑟2)) 𝑚𝑜𝑑 𝑞.
Thuật xác minh chữ ký:
Đầu vào: m, 𝑄, (𝑟1, 𝑟2, 𝑠).
Đầu ra: “Chữ ký hợp lệ” hoặc “Chữ ký không hợp lệ”.
Bước 1 : Kiểm tra 𝑟1, 𝑟2 và 𝑠 thuộc khoảng [1, 𝑞 − 1]? Nếu sai, đưa ra “chữ ký không hợp lệ” và dừng lại. Bước 2: Tính 𝑤 = 𝑠−1 𝑚𝑜𝑑 𝑞. Bước 3: Tính ℎ = 𝐻(𝑚). Bước 4: Tính 𝑢1 = ℎ𝑤𝑘2 𝑚𝑜𝑑 𝑞. Bước 5: Tính 𝑢2 = (𝑟1+ 𝑟2)𝑤 𝑚𝑜𝑑 𝑞. Bước 6: Tính (𝑥0, 𝑦0) = 𝑢1𝑃 + 𝑢2𝑄. Bước 7: Tính 𝑣 = 𝑥0 𝑚𝑜𝑑 𝑞.
Bước 8: Đưa ra “Chữ ký hợp lệ” nếu 𝑣 = 𝑟1; ngược lại trả về “Chữ ký không hợp lệ”.
Nhận xét: Khóa 𝑘2 được sử dụng trong thuật toán ký được sử dụng như một khóa bí mật tức thời, nhưng nó lại được sử dụng trong bước 4 của thuật toán xác minh. Điều này dẫn đến sự bất hợp lý của lược đồ này. Tuy nhiên, đây không phải là một vấn đề quá lớn, vì chỉ cần thực hiện một vài thay đổi nhỏ để đảm bảo tính hợp lý cho lược đồ này. Cụ thể, có 3 chỉnh sửa là:
- Chữ ký trong bước 6 của thuật toán ký là (𝑟1, 𝑅2, 𝑠) thay cho (𝑟1, 𝑟2, 𝑠). - Bước 4 của thuật toán xác minh 𝑢1 ← ℎ𝑤 𝑚𝑜𝑑 𝑞.
- Bước 6 của thuật toán xác minh được sửa là (𝑥0, 𝑦0) ← 𝑢1𝑅2 + 𝑢2𝑄.
Thuật toán ký ECDSA 2 khóa được sửa đổi:
Đầu vào: m, a. Đầu ra: (𝑟1, 𝑅2, 𝑠). Bước 1: Chọn 𝑘1, 𝑘2 ∈ [1, … , 𝑞 − 1]. Bước 2: Tính 𝑅1(𝑥1, 𝑦1) = 𝑘1𝑃; 𝑅2(𝑥2, 𝑦2) = 𝑘2𝑃. Bước 3: Tính 𝑟1 = 𝑥1 𝑚𝑜𝑑 𝑞, 𝑟2 = 𝑥2 𝑚𝑜𝑑 𝑞. Bước 4: Tính ℎ = 𝐻(𝑚). Bước 5: Tính 𝑠 = 𝑘1−1(ℎ𝑘2 + 𝑎(𝑟1+ 𝑟2)) 𝑚𝑜𝑑 𝑞.
Thuật xác minh chữ ký:
Đầu vào: m, 𝑄, (𝑟1, 𝑅2, 𝑠).
Đầu ra: “Chữ ký hợp lệ” hoặc “Chữ ký không hợp lệ”.
Bước 1: Kiểm tra 𝑟1 và 𝑠 thuộc khoảng [1, . . , 𝑞 − 1]? và kiểm tra 𝑅2 thuộc đường cong? Bước 2: Tính 𝑤 = 𝑠−1 𝑚𝑜𝑑 𝑞. Bước 3: Tính ℎ = 𝐻(𝑚). Bước 4: Tính 𝑢1 = ℎ𝑤 𝑚𝑜𝑑 𝑞. Bước 5: Tính 𝑢2 = (𝑟1+ 𝑟2)𝑤 𝑚𝑜𝑑 𝑞. Bước 6: Tính (𝑥0, 𝑦0) = 𝑢1𝑅2+ 𝑢2𝑄. Bước 7: 𝑇í𝑛ℎ 𝑣 = 𝑥0 𝑚𝑜𝑑 𝑞.
Bước 8: Đưa ra “Chữ ký hợp lệ” nếu 𝑣 = 𝑟1; ngược lại trả về “Chữ ký không hợp lệ”.
Tính đúng đắn của việc sửa đổi ở trên được thể hiện ở chỗ, nếu (𝑟1, 𝑅2, 𝑠) là chữ ký của 𝑚 được sinh ra theo thuật toán sinh chữ ký thì khi kiểm tra bằng thuật toán xác minh sẽ cho kết quả hợp lệ. Thật vậy, ta luôn có:
𝑠 = 𝑘1−1(ℎ𝑘2+ 𝑎(𝑟1 + 𝑟2)) ⇔ 𝑘1 = 𝑠−1(ℎ𝑘2+ 𝑎(𝑟1+ 𝑟2)) ⇔ 𝑘1 = ℎ𝑠−1𝑘2+ (𝑟1+ 𝑟2)𝑠−1𝑎 ⇔ 𝑘1 = ℎ𝑤𝑘2+ (𝑟1+ 𝑟2)𝑤𝑎 ⇔ 𝑘1 = 𝑢1𝑘2 + 𝑢2𝑎.
Do đó, ta luôn thu được:
𝑘1𝑃 = 𝑢1𝑘2𝑃 + 𝑢2𝑎𝑃, điều này dẫn đến:
𝑅1(𝑥1, 𝑦1) = 𝑢1𝑅2+ 𝑢2𝑄 = (𝑥0, 𝑦0), và vì vậy: 𝑟1 = 𝑥1 𝑚𝑜𝑑 𝑞 = 𝑥0 𝑚𝑜𝑑 𝑞 = 𝑣.
Nghĩa là thuật toán xác minh luôn trả về kết quả hợp lệ nếu chữ ký được kiểm tra được sinh ra từ thuật toán tạo chữ ký. Do đó, dưới đây NCS sẽ đánh giá về lược đồ sửa đổi thay vì đánh giá lược đồ ban đầu.
Đánh giá thuật toán ký ECDSA 2 khóa sửa đổi: Theo [23], [26], nếu sử dụng cùng cặp khóa bí mật tức thời (𝑘1, 𝑘2) đối với việc ký hai thông điệp 𝑚1, 𝑚2 khác nhau (giả sử hai chữ ký tương ứng là (𝑟1, 𝑅2, 𝑠1) và (𝑟1, 𝑅2, 𝑠2)) thì khóa ký 𝑎 không bị lộ bởi lý do sau:
{𝑠1 = 𝑘1 −1(𝑘2ℎ1+ 𝑎(𝑟1+ 𝑟2)) 𝑚𝑜𝑑 𝑞 𝑠2 = 𝑘1−1(𝑘2ℎ2+ 𝑎(𝑟1+ 𝑟2)) 𝑚𝑜𝑑 𝑞 ở đây ℎ1 = 𝐻(𝑚1) và ℎ2 = 𝐻(𝑚2), nên ta có: 𝑘1𝑠1 − 𝑘1𝑠2 = (ℎ1𝑘2+ 𝑎(𝑟1+ 𝑟2) − ℎ2𝑘2− 𝑎(𝑟1+ 𝑟2)) 𝑚𝑜𝑑 𝑞. ⇔ 𝑘1(𝑠1 − 𝑠2) = 𝑘2(ℎ1− ℎ2) 𝑚𝑜𝑑 𝑞. (2.1)
Theo các tác giả trong [23] và [26] kết luận rằng vì không thể thu được 𝑘1, 𝑘2 từ phương trình (2.1) và do vậy lược đồ này là an toàn hơn lược đồ ECDSA gốc. Tuy nhiên, theo quan điểm của NCS thì điều này không thực sự chính xác, bởi mặc dù không thể tìm ra cụ thể 𝑘1, 𝑘2 (nên khóa ký 𝑎 không bị lộ) nhưng dựa trên mối liên hệ giữa 𝑘1 và 𝑘2 theo (2.1) thì kẻ tấn công sử dụng thông điệp nào cũng có thể giả mạo chữ ký hợp lệ trên thông điệp 𝑚 tùy ý mà không cần biết khóa ký 𝑎. Điều này được NCS đưa ra trong mệnh đề sau.
Mệnh đề 2.1. Trong thuật toán ký ECDSA 2 khóa sửa đổi, nếu hai thông điệp
𝑚1 ≠ 𝑚2 cùng được ký bởi cặp khóa bí mật tức thời (𝑘1, 𝑘2) thì bất cứ kẻ tấn công sử dụng thông điệp nào cũng có thể giả mạo chữ ký hợp lệ trên thông điệp 𝑚 tùy ý mà không cần biết khóa ký 𝑎 của người dùng 𝐴.
Chứng minh: Với ℎ1 = 𝐻(𝑚1) và ℎ2 = 𝐻(𝑚2), chúng ta xét 2 trường hợp: TH1: nếu ℎ1 = ℎ2, thì dễ dàng suy ra chữ ký hợp lệ trên 𝑚1 cũng là hợp lệ trên 𝑚2, nên kẻ tấn công có thể yêu cầu chữ ký (𝑟1, 𝑅2, 𝑠) trên 𝑚1 và sau đó đưa ra cặp thông điệp chữ ký giả mạo hợp lệ là 𝑚2, (𝑟1, 𝑅2, 𝑠), mà không cần biết khóa ký của người dùng 𝐴.
TH2: Như đã đề cập, nếu sử dụng cùng cặp khóa bí mật tức thời (𝑘1, 𝑘2) đối với việc ký hai thông điệp 𝑚1, 𝑚2 khác nhau (giả sử hai chữ ký tương ứng là (𝑟1, 𝑅2, 𝑠1) và (𝑟1, 𝑅2, 𝑠2)) thì chúng ta thu được mối liên hệ là:
𝑘1(𝑠1− 𝑠2) = 𝑘2(ℎ1− ℎ2) 𝑚𝑜𝑑 𝑞. Do đó, chúng ta có:
𝑘1−1𝑘2 = (ℎ1− ℎ2)−1(𝑠1− 𝑠2) 𝑚𝑜𝑑 𝑞. (2.2) Từ thông tin này, việc giả mạo chữ ký trên thông điệp 𝑚 được thực hiện đơn giản như sau:
1. Tính ℎ = 𝐻(𝑚) và 𝑐 = ℎ − ℎ1.
2. 𝑠 = (𝑠1+ (ℎ1− ℎ2)−1(𝑠1− 𝑠2)𝑐) 𝑚𝑜𝑑 𝑞. 3. Trả về chữ ký (𝑟1, 𝑅2, 𝑠) cho thông điệp 𝑚.
Chúng ta có thể thấy nếu (𝑟1, 𝑅2, 𝑠1) là chữ ký của thông điệp 𝑚1 theo thuật toán ký, thì (𝑟1, 𝑅2, 𝑠) là chữ ký hợp lệ của thông điệp 𝑚. Thật vậy, chúng ta có 𝑠 = (𝑠1+ (ℎ1− ℎ2)−1(𝑠1− 𝑠2)𝑐) 𝑚𝑜𝑑 𝑞, nên theo (2.2) ta có:
𝑠 = (𝑠1+ 𝑘1−1𝑘2(ℎ − ℎ1)) 𝑚𝑜𝑑 𝑞.
= 𝑘1−1(𝑘2ℎ1+ 𝑎(𝑟1+ 𝑟2)) + 𝑘1−1𝑘2(ℎ − ℎ1) 𝑚𝑜𝑑 𝑞. = 𝑘1−1(𝑘2ℎ + 𝑎(𝑟1 + 𝑟2)) 𝑚𝑜𝑑 𝑞.
Do đó, dễ thấy rằng: (𝑠−1ℎ)𝑅2+ (𝑟1+ 𝑟2)𝑠−1𝑄 = 𝑘1𝑃.
hay chữ ký (𝑟1, 𝑅2, 𝑠) và thông điệp 𝑚 thỏa mãn phương trình xác minh và như vậy (𝑟1, 𝑅2, 𝑠) là chữ ký hợp lệ của thông điệp 𝑚.■
Nhận xét: Các lược đồ chữ ký số như ECDSA, EC-Schnorr,… cũng đã được
thử sửa theo hướng sử dụng hai khóa ký 𝑎1, 𝑎2 đối với một người sử dụng 𝐴. Tuy nhiên, vẫn nhận được một kết quả tương tự là lược đồ chữ ký số sửa đổi không an toàn hơn lược đồ chữ ký số gốc.