2 2 1 Phương pháp sử dụng lược đồ chữ ký số tất định
Một phương án được xem xét để đảm bảo các khóa bí mật tức thời được sinh một cách độc lập là sử dụng các lược đồ chữ ký số tất định thay cho các lược đồ chữ ký số xác suất Cụ thể, trong các lược đồ chữ ký số tất định, khóa bí mật tức thời được sinh một cách tất định và phụ thuộc vào thông điệp được ký thay vì được chọn ngẫu nhiên Sau đây chúng ta sẽ xem xét hai lược đồ chữ ký số tất định, ECDSA và EC-Schnorr
a) Lược đồ chữ ký số ECDSA tất định [56] (DECDSA):
Thuật toán ký (của� trên thông điệp�):
Đầu vào: m, a
Đầu ra: (�, �)
Bước 1: Tính� = �(�||�)
Bước 2: Tính� = �� = (�� , �� )
Bước 3: Tính� = ������, nếu� = 0 quay về bước 1
Bước 4: Tínhℎ = �(�)
Bước 5: Tính� = � −1(ℎ + ��) ����; nếu� = 0, quay lại bước 1
Bước 6: Đưa ra chữ ký của� trên thông điệp� là (�, �)
Thuật toán xác minh chữ ký:
Đầu vào: m,�, (�, �)
Đầu ra: “Chữ ký hợp lệ” hoặc “Chữ ký không hợp lệ”
Bước 1: Xác minh�, � có thuộc [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 = ℎ����� và�2 = ������
Bước 5: Tính� = �1� + �2� = (�� , �� ) và tính� = ������
Bước 6: Đưa ra “Chữ ký hợp lệ” nếu� = �; ngược lại trả về “Chữ ký không hợp lệ”
Chúng ta có thể thấy rằng dường như lược đồ chữ ký số DECDSA sẽ lặp vô hạn ở Bước 3 và Bước 5 của thuật toán ký, mặc dù xác suất xảy ra những sự kiện như vậy là rất thấp Tuy nhiên, để tránh vấn đề đó xảy ra thì theo mô tả trong [56], � sẽ được thiết lập với một hàm HMAC (cụ thể là HMAC_DRBG) sao cho nếu Bước 3 hoặc Bước 5 yêu cầu quay lại Bước 1 thì một giá trị mới sẽ được sinh ra Cụ thể như sau:
Khi bắt đầu thuật toán ký thông điệp�, hai giá trị� và� sẽ được gán với một giá trị cố định, chẳng hạn� = 0�01 … 0�01 và� = 0�00 … 0�002 Sau đó tính:� = HMAC� (�||�||�) và� = HMAC� (�)
Lặp lại các bước sau cho đến khi tìm được� thỏa mãn điều kiện của DECDSA:
- Lấy chuỗi rỗng�, nghĩa là độ dài bit của � lúc đầu bằng 0
- Khi độ dài bit của� vẫn nhỏ hơn độ dài bit của�, tiếp tục thực hiện: � = ����� (�) và� = �||�
- Chuyển� sang dạng số nguyên và gán giá trị đó cho khóa� Nếu giá trị này thỏa mãn Bước 3 và Bước 5 của thuật toán ký thì kết thúc quá trình sinh khóa� Ngược lại, tính� = �(�||0�00) và� = ����� (�), sau đó tiếp tục vòng lặp để tìm lại� thỏa mãn
Phân tích an toàn: Đối với lược đồ DECDSA và các biến thể tương ứng của các lược đồ chữ ký số dựa trên ECDLP như EC-Schnorr, EC-GDSA,…chúng ta luôn được đảm bảo rằng khả năng mà hai thông điệp khác nhau được ký bởi cùng một khóa bí mật tức thời là rất khó xảy ra nếu hàm băm được sử dụng có tính chất kháng va chạm Điều này có được bởi vì, trong lược đồ DECDSA, nếu kẻ tấn công có thể thu được chữ ký của hai thông điệp�1 ≠ �2 mà các khóa bí mật tức thời được sử dụng trong quá trình tạo chữ ký cho chúng bằng nhau (nghĩa là�(�||�1) = �(�||�2)) thì có thể xây dựng trên kẻ tấn công này một bộ tìm kiếm va chạm hiệu quả đối với hàm băm� Như vậy, bằng việc sử dụng các lược đồ chữ ký số tất định chúng ta đã giải quyết được bài toán lựa chọn bộ tạo số ngẫu nhiên chất lượng cao cũng như không phải lo ngại các yếu tố tạo ra bộ tạo số ngẫu nhiên yếu làm ảnh hưởng đến tính an toàn của lược đồ chữ ký số
2
hàm nhận đầu vào là một số thập phân và đưa ra số nguyên gần nhất và hLen là độ dài bit của hàm băm�
ℎ���
Phân tích điểm hạn chế của giải pháp này: Như đã chỉ ra ở trên, phương pháp sử dụng các lược đồ chữ ký số tất định có ưu điểm hơn so với các lược đồ xác suất trong việc ngăn chặn các tấn công khôi phục khóa ký dài hạn từ việc dùng lặp lại khóa bí mật tức thời Tuy nhiên, đã có một số tấn công cài đặt lên các lược đồ chữ ký số tất định Ta xem xét kỹ hai kịch bản tấn công gây lỗi lên lược đồ chữ ký số DECDSA đã được đề xuất trong [20], ở đó kẻ tấn công được giả sử có khả năng can thiệp vật lý vào thiết bị ký Trong các kịch bản đó, giả sử rằng kẻ tấn công đã nhận được một chữ ký chính xác (�0, �0) cho thông điệp�:
* K ch b n 1:ị ả Kẻ tấn công sửa đổi� thành�′ sau khi�(�||�) đã được tính Tấn công theo cách sửa đổi thông tin được thực hiện theo giao thức sau giữa� là người tấn công và� là người giữ tham số mật�
Giao thức 2 1 Tấn công thứ nhất lên lược đồ DECDSA
� (người tấn công) � (người giữ bí mật dài hạn �)
Bước 1 Chọn thông báo� bất kỳ Gửi yêu cầu ký lên� đến�
Bước 2 Tính: (�, �) = ��������� (�, �) Gửi (�, �) cho�
Bước 3 Gửi yêu cầu ký lên� đến�
Bước 4
Thay� bằng�’ trên thiết bị tính toán của� trong khoảng thời gian ngay sau khi thiết bị này tính xong bước 1 trong thuật toán ký DECDSA và trước khi thiết bị này thực hiện bước 4
Tính: (�’, �’) =
��������� (�′, �)
Gửi (�’, �’) cho�
Bước 5
Nếu (�’ ≠ �) quay lại bước 1 Ngược lại lấy
−1 ′ ′ −1 � = � ℎ − �ℎ���� −1 −1 ′ � = �(� − � ) ���� −1 � = �� ����
* Kịch bản 2: Do trong thực tế ECDSA và các lược đồ chữ ký dựa trên DLP đều có nguy cơ bị tấn công timing (đo thời gian thực hiện) Để tránh điều đó, một phương pháp phổ biến được sử dụng là gây nhiễu việc tính thành phần� trong chữ ký Cụ thể, thành phần này được làm nhiễu bằng cách tính
� ≔�([�(�||�) + �1�]�) ����, ở đó�1 là một số nguyên ngẫu nhiên bất kỳ và� là hàm trích xuất hoành độ của một điểm thuộc đường cong Trong trường hợp này, có thể xảy ra kịch bản tấn công như sau đối với thuật toán ký của lược đồ DECDSA: Ở đây, giả thiết rằng kẻ tấn công có quyền can thiệp vào bước tính � ≔�([�(�||�) + �1�]�) ���� để tạo ra một chữ ký
(� ′, �′) khác trên cùng thông điệp m (chi tiết về cách can thiệp để gây lỗi được mô tả trong [20]) Lưu ý chữ ký này không nhất thiết phải hợp lệ Khi đó, kẻ tấn công có thể thực hiện như tấn công theo Giao thức 2 2 và thu được khóa bí mật� như được chỉ ra trong Kết quả 2 3
Giao thức 2 2 Tấn công thứ 2 lên lược đồ DECDSA
� �
Bước 1 Chọn thông báo� bất kỳ Gửi yêu cầu ký lên� đến S
Bước 2
Tính:
(�, �) = ��������� (�, �) Gửi (�, �) cho�
Bước 3 Gửi yêu cầu ký lên� đến�
Bước 4
Can thiệp vào bước tính r ≔ �([�(||�) + �1�]�) ���� Tính: (�’, �’) = ��������� (�, �) Gửi (�’, �’) cho� Bước 5 ′ ′ −1 Lấy� = (�� − ��) ���� ′ � = �(�)(� − � ) ���� � = ������
Kết quả 2 3 Giao thức 2 2 sẽ trả về giá trị tính được của� chính là khóa bí mật của� trong trường hợp chèn lỗi khiến� ′ ≠ � ở bước 4
Chứng minh Kết thúc bước 5 của giao thức 2 2, chúng ta thu được hệ hai
phương trình hai ẩn (mấu chốt ở đây là do tính tất định của �(�||�)): �(�||�)�0 = ��0 + �(�) ����
�(�||�)� ′ = �� ′ + �(�) ���� Do đó,
�(�||�)�0� ′ = ��0� ′ + �(�)� ′���� �(�||�)� ′�0 = �� ′�0 + �(�)�0 ����
Lưu ý rằng việc chèn lỗi khiến� ≠ �′ và do đó� ≠ � ′, tiếp theo trừ theo vế của hai phương trình ở trên ta có:
�(�0� ′ − � ′�0) = �(�)(�0 − � ′) ���� � = (�0� ′ − � ′�0)−1�(�)(�0 − � ′) ���� Tóm lại kết quả đã được chứng minh ■
Các tác giả trong [20] cũng lưu ý rằng tấn công được xem xét chỉ gây ảnh hưởng đến các lược đồ chữ ký số tất định mà không áp dụng được cho các lược đồ chữ ký số xác suất mà có nguồn ngẫu nhiên tốt Điều này có thể được minh họa thông qua trường hợp của lược đồ chữ ký số ECDSA
Cụ thể, trong kịch bản tấn công trên lên lược đồ chữ ký số DECDSA, kẻ tấn công đều thu được một hệ hai phương trình hai ẩn (khóa ký � và khóa bí mật tức thời�(�||�)) nên dễ dàng khôi phục lại khóa ký� Trong khi đó, đối với lược đồ chữ ký số ECDSA thông thường mỗi khóa bí mật tức thời được sinh mới và được xem là một ẩn riêng biệt, nên nếu kẻ tấn công thực hiện tấn công tương tự thì chỉ thu được một hệ hai phương trình nhưng có ba ẩn (khóa ký và hai khóa bí mật tức thời) Do đó, các tấn công gây lỗi trên lược đồ chữ ký số DECDSA khó có thể áp dụng đối lược đồ chữ ký số ECDSA
b) Lược đồ chữ ký số EC-Schnorr tất định
Thuật toán ký (của� trên thông điệp�):
Đầu vào: m, a Đầu ra: (�, �)
Bước 1: Tính� = �(�||�)
Bước 2: Tính � = �� = (�� , �� )
Bước 3: Tính� = �(�||�� ), nếu� = 0 ����, quay lại bước 1
Bước 4: Tính� = (� − ��) ����, nếu� = 0 ����, quay lại bước 1
Bước 5: Đưa ra ch ký c a A trên thông đi p m là (ữ ủ ệ �, �)
Thuật toán xác minh chữ ký:
Đầu vào: m,�, (�, �)
Đầu ra: “Chữ ký hợp lệ” hoặc “Chữ ký không hợp lệ”
Bước 1: Xác minh�, � có thuộc [1, � − 1]? Nếu sai, đưa ra “chữ ký không hợp lệ” và dừng lại
Bước 2: Tính� = �� + �� = (�� , �� ) Nếu� = �, đưa ra “chữ ký không hợp lệ” và dừng lại
Bước 3: Tính� = �(�‖�� )
Bước 4: Đưa ra “Chữ ký hợp lệ” nếu� = �; ngược lại trả về “Chữ ký không hợp lệ”
Tiếp theo, chúng ta xem xét lược đồ EC-Schnorr tất định với các kịch bản tấn công gây lỗi lên lược đồ chữ ký số DECDSA mà đã được đề cập ở trên Trong các kịch bản đó, giả sử rằng kẻ tấn công đã nhận được một chữ ký chính xác (�0, �0) của� (nghĩa là�0 = �(�‖�� ), với� = (�� , �� ) =
�(�||�)�)
* Kịch bản 1: Kẻ tấn công sửa đổi� thành�′ sau khi�(�||�) đã được tính Nghĩa là,� ′ được tính với khóa bí mật tức thời�(�||�), và� ′ = �(�′‖�� ) Trong trường hợp này, kẻ tấn công thu được:
�(�||�) = (� ′ + �′�) ���� Trừ theo vế hai phương trình ở trên ta có:
�(�0 − � ′) = (� ′ − �0) ���� � = (� ′ − �0)(�0 − � ′)−1����
* Kịch bản 2: Việc tính��′ ≔�([�(�||�) + �1�]�) bị tấn công, Khi đó, kẻ tấn công thu được:
�(�||�) = (�0 + ��(�||�� )) ���� �(�||�) = (� ′ + ��(�||��′ )) ���� Tương tự như trên chúng ta suy ra:
−1
����
2 2 2 Phương pháp sử dụng hai khóa bí mật tức thời
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)) ����
Bước 6: Đưa ra chữ ký của� trên thông điệp� là (�1, �2, �) � = (� ′ − �0)(�(�||�� ) − �(�||��′ ))
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à