Các trò chơi online ngày nay đang trở thành một phần quan trọng của cuộc sống giải trí của con người. Tuy nhiên, với sự phát triển của các trò chơi này, việc đảm bảo tính bảo mật và an toàn cho người dùng trong những trò chơi yêu cầu tính bảo mật và ẩn danh cao là một thách thức lớn. Điều này trở nên đặc biệt quan trọng khi chúng ta xem xét đến các trò chơi sử dụng tiền bạc thật như các casino.
Tuy nhiên, vấn đề này có thể được giải quyết bằng cách sử dụng Zero-Knowledge Proof
Khuyến nghị đọc trước Zero-Knowledge Proof là gì và cách hoạt động để sẵn sàng trước khi đi vào bài viết này.
Giới thiệu về Mental Poker Problem
Mental Poker Problem
Nhưng tại sao lại là Poker? Vì nó là một ví dụ hoàn hảo để đại diện cho vấn đề trên. Trong bài viết này, quy ước rằng Poker được đề cập đến là Texas Hold'em.
Vấn đề của trò chơi online hiện nay
Để hiểu rõ hơn, trong khi mọi người cùng nhau chơi một ván bài ngoài đời thực. Sẽ rất khó để ai đó có thể gian lận (như xem bài của người khác, thay đổi bài của mình,...) mà không bị phát hiện, vì mọi người lúc này đều có thể nhìn thấy các hành động của nhau.
Nhưng hãy tưởng tượng những gì sẽ xảy ra nếu đây là một ván bài từ xa thông qua bưu điện?
Sẽ có hai cách để chơi:
- Mô hình peer-to-peer
( hay p2p) : Một người chơi nắm giữ bộ bài và xáo bài, sau đó gửi đi cho những người chơi khác. - Mô hình client-server: Nhờ một người khác làm trung tâm, thực hiện xáo bài và quản lí các lá bài của mọi người.
Cách 1: Mô hình peer-to-peer
Nhưng bộ bài lúc này buộc phải nằm trên tay một người chơi nào đó, người thực hiện xáo bài và gửi đi cho những người chơi khác. Điều này đồng nghĩa với việc chúng ta buộc phải tin tưởng không chỉ người này mà toàn bộ những người khác.
Bởi vì người đó có thể biết được toàn bộ bài của mọi người. Hơn nữa, không ai có thể kiểm soát, đưa ra các quyết định hay làm chứng được những gì đang xảy ra.
Vì vậy, cách thứ 2 trông có vẻ ổn hơn.
Cách 2: Mô hình client-server
Với cách này, chúng ta sẽ tổ chức trò chơi theo kiểu Dealer (Nhà cái) và người chơi. Dealer sẽ xáo bài và nắm giữ các lá bài của mọi người. Lúc này, người chơi sẽ chỉ việc nhận các thông tin của ván bài từ dealer và gửi các quyết định của mình cho dealer.
Việc dealer nắm giữ thông tin của các người chơi để tránh việc người chơi tương tác trực tiếp với nhau nhằm gian lận là một điều tất yếu. Tuy nhiên, điều này lại đồng nghĩa với việc chúng ta phải tin tưởng vào dealer tuyệt đối, trong khi:
- Dealer hoàn toàn biết được toàn bộ lá bài và có thể thông đồng với một ai đó để giúp họ gian lận.
- Ai đó có thể đe dọa hoặc âm thầm theo dõi dealer để gian lận.
- Dealer có thể thao túng, nói dối người chơi hoặc âm thầm thay đổi giá trị của các lá bài.
Kết luận vấn đề
Việc chơi poker qua bưu điện chính là một mô hình hóa của hình thức chơi poker online hiện nay (hoàn toàn tương đương nhau).
Giải pháp
Để giải quyết vấn đề này, chúng ta cần phải loại bỏ dealer ra khỏi trò chơi. Nhưng lúc này, người thực hiện việc xáo bài và giám sát chính là những người chơi, dẫn đến những vấn đề đã được đề cập ở cách 1.
Do đó, trò chơi phải được triển khai bằng những thuật toán mã hóa đặc biệt để giúp người chơi tương tác trực tiếp với nhau nhưng vẫn không cần phải tin tưởng nhau.
Commutative Encryption
Commutative Encryption
Ví dụ, khi Bob có một tin nhắn từ Alice và tin nhắn này bị mã hóa bởi mật khẩu cả hai, thì dù cho Bob giải mã trước rồi Alice giải mã sau hay ngược lại thì vẫn ra được tin nhắn ban đầu.
Để hình tượng hóa phương pháp này, hãy liên tưởng đến một chiếc hộp đã được khóa và chúng ta muốn khóa thêm một lần nữa:
- Đối với các phương pháp mã hóa thông thường, chúng ta sẽ khóa lên chiếc ổ khóa cũ. Lúc này, để mở được hộp, chúng ta phải mở ổ khóa bên ngoài trước để có thể mở ổ khóa bên trong.
Nhưng đối với Commutative Encryption, chúng ta chỉ việc khóa thêm một ổ khóa. Lúc này, chúng ta có thể mở được hộp mà không cần phải quan tâm đến thứ tự mở khóa.
Đi vào thuật toán
Thuật toán này sẽ được thực hiện tương tự ví dụ sau.
Ví dụ về thuật toán
Alice và Bob cùng nhau chơi một ván bài Poker và cùng đồng ý một bộ bài nhất định, có nghĩa là họ biết được và đồng ý về các giá trị và số lượng của các lá bài này.
Giai đoạn I: Xáo bộ bài
- Alice tạo cho mình một mật khẩu và dùng nó mã hóa từng lá bài này.
- Alice xáo từng lá bài đó theo cách của Alice.
- Alice gửi bộ này cho Bob.
- Bob cũng tạo cho mình một mật khẩu và dùng nó để mã hóa lại từng lá bài.
- Bob xáo lại từng lá bài đó theo cách của Bob.
- Bob gửi lại bộ bài này cho Alice.
Giai đoạn II: Khóa từng lá bài
- Alice giải mã các lá bài bằng mật khẩu của mình, tuy nhiên nó vẫn còn bị mã hóa bởi mật khẩu của Bob.
- Alice mã hóa lần nữa từng lá bài, nhưng khác với lần trước, mỗi lá bài sẽ được mã hóa bởi những mật khẩu riêng biệt do Alice nắm giữ.
- Alice gửi lại bộ bài này cho Bob.
- Bob giải mã các lá bài bằng mật khẩu của mình, tuy nhiên nó vẫn còn bị mã hóa bởi lớp mật khẩu khác của Alice.
- Bob mã hóa lần nữa từng lá bài, giống như Alice, mỗi lá bài sẽ được mã hóa bởi những mật khẩu riêng biệt do Bob nắm giữ.
- Bob gửi lại bộ bài này cho Alice.
Giai đoạn III: Giải mã các lá bài của nhau
- Mỗi bên sẽ nhận được hai lá bài, giả sử Alice sẽ nhận được lá bài thứ 1 và 3, còn Bob nhận được lá bài thứ 2 và 4.
- Bob gửi cho Alice mật khẩu của lá bài thứ 1 và 3.
- Alice giải mã hai lá bài trên tay bằng các mật khẩu mà mình đã mã hóa và các mật khẩu mà Bob vừa gửi. Sau đó gửi mật khẩu của lá bài thứ 2 và 4 cho Bob.
- Bob cũng giải mã hai lá bài trên tay bằng các mật khẩu mà mình đã mã hóa và các mật khẩu mà Alice vừa gửi. Lúc này cả hai đều có thể biết được hai lá bài trên tay của mình.
Giai đoạn IV: Lật các lá bài trên bàn
- Alice và Bob sẽ đặt tiền cược và lật các lá bài (từ 5 đến 10). Rõ ràng, các lá bài này chỉ có thể lộ ra khi cả hai cùng đồng thuận lật bài. Hay nói cách khác, nếu xảy ra gian lận, chỉ có thể rằng tất cả mọi người cùng nhau đồng ý gian lận.
- Khi đến với phần xác định người thắng cuộc, Alice và Bob sẽ giải mã các lá bài của nhau để xem bài.
Kết luận về thuật toán
Như vậy, với thuật toán này, chúng ta có thể đảm bảo rằng người xáo bài cuối cùng không biết được toàn bộ các lá bài. Đối với những sòng có nhiều người chơi hơn, chúng ta chỉ cần thêm các bước mã hóa và giải mã của họ trong mỗi giai đoạn.
Triển khai thuật toán
Bài viết này sẽ giới thiệu một cách triển khai của Adam Barnett và Nigel P. Smart 1.
Quy ước kí hiệu
Kí hiệu cho biết phần tử được chọn ngẫu nhiên từ .
Kí hiệu cho biết ánh xạ
Giả định
Cho một nhóm gồm người chơi được đánh dấu bằng chỉ số :
Bộ bài hợp lệ được dùng trong trò chơi gồm 52 lá bài được biểu diễn như sau:
Và 52 lá bài này được đánh dấu bằng chỉ số :
Biết rằng với mỗi lá bài có thể được biểu diễn bằng chất và bậc :
Giả định rằng các người chơi đồng ý sử dụng Finitely Generated Abelian Group
Lưu ý
Một Finitely Generated Abelian Grouplà một Abelian Group( Nhóm Abel ) mà có thể được tạo ra bằng cách sử dụng một số hữu hạn các phần tử. Cụ thể, tồn tại một tập hữu hạn các phần tử trong nhóm sao cho mọi phần tử trong có thể biểu diễn được dưới dạng tổ hợp tuyến tính
( linear combination ) của các phần tử trong tập này: Cấp của nhóm là số lượng các phần tử trong tập , nó là một số nguyên tố, và phép toán của nhóm phải là phép toán giao hoán (cộng hoặc nhân).
Với cấp số , ta có tập là một Multiplicative Group of Integers Modulo
Quy trình
Tạo khóa
Mỗi người chơi
Mã hóa lá bài
Mã hóa toàn bộ các lá bài bằng cách sử dụng một hàm mã hóa
Lá bài đã mã hóa có thể được mã hóa thêm lần nữa bằng cách cộng với một số bí mật như sau:
Trong đó, là một số ngẫu nhiên bí mật được tạo ra bởi người chơi đó để mã hóa lá bài.
Tuy nhiên ở lượt mã hóa đầu tiên, lá bài vẫn đang ở dạng chuẩn , cho nên nó sẽ được chuyển hóa thành như sau:
Do đó, ở lượt mã hóa đầu tiên, kết quả sẽ là:
Giải mã lá bài
Qua các công thức trên, ta có thể thấy một lá bài được mã hóa
gồm hai thành phần và và chúng có cùng hệ số . Để giải mã lá bài được mã hóa , người chơi
Tập hợp các giá trị từ tất cả mọi người (những người đã mã hóa lá bài) sẽ giải mã được :
Chứng minh
Ta có thể chứng minh được công thức trên như sau:
Xáo bài
Làm sao để đảm bảo bộ bài mà ai đó xáo là hợp lệ? Hay nói cách khác, bộ bài sau khi được xáo phải khớp với bộ bài ban đầu, không có lá bài nào bị thêm vào hay bị bỏ đi.
Trước tiên, cơ chế mã hóa và xáo được thực hiện cùng lúc bằng cách chọn một tập hợp các số bí mật dùng để mã hóa:
Và một hàm hoán vị
Vì tổng có tính chất giao hoán, nên tổng của các chỉ mục ban đầu sẽ luôn bằng tổng của các chỉ mục sau khi hoán vị:
Khi đó bộ bài sẽ được xáo thành với theo từng lá bài:
Chứng minh
Chọn ngẫu nhiên một số , lí do là vì chúng ta sẽ dùng số này để nhân với các lá bài.
Một lượt xáo bài hợp lệ là khi:
Vế trái sẽ là đa thức của Verifier (người xáo bài trước) vì vế này chỉ sử dụng là thứ tự các lá bài mà người này thực hiện xáo.
Trong khi đó vế phải là đa thức của Prover (người xáo bài lần này), vì chỉ người này mới có những thông tin bí mật như hay .
Giải thích
Chúng ta sẽ chứng minh công thức trên như sau.
Cho một nhân tử bất kì
Thay những giá trị này vào công thức trên, ta được:
Kết luận
Pheeew! Chúng ta đã đi qua rất nhiều công thức phức tạp, nhưng nếu hiểu được nó, chúng ta có thể dễ dàng chuyển đổi nó thành code. Còn nếu không thì hãy bình luận bên dưới những thắc mắc để được trợ giúp nhé.