Wednesday, July 06, 2005

Rắc rối hóa chương trình (2)


Đánh dấu mờ phần mềm (wartermarking software) là một ứng dụng hay nếu ta có thể thực sự viết O. Ý nghĩa căn bản của cái gọi là "đánh dấu mờ" như sau:
  • Giả dụ ta có một chương trình P đem bán cho khách hàng, nhưng muốn tránh việc khách hàng copy P cho người khác, ta tìm cách, với mỗi khách hàng G, trộn vào trong P một đoạn mã C(G) nào đó, biến P thành P(G).
  • P(G) về mặt chức năng thì giống hệt P, và việc thêm C(G) vào P không ảnh hưởng nhiều đến hiệu suất của P.
  • C(G) còn có một thuộc tính toán học nào đó mà ta có thể kiểm tra bằng cách kiểm tra P(G). Thuộc tính toán học này có thể dùng để chứng minh rằng P(G) thuộc về khách hàng G. Như vậy, hai khách hàng G1 và G2 khác nhau sẽ có hai chương trình P(G1) và P(G2) khác nhau [và ta kiểm tra được điều đó], dù là chúng giống hệt nhau về mặt chức năng.
  • C(G) có thể xem như con dấu hay chữ ký của khách hàng G đã đóng vào P. Như thế G sẽ không đem bản của mình cho người khác được.
  • Dĩ nhiên là cả hệ thống phải được thiết kế sao cho việc lấy C(G) ra khỏi P(G) là cực kỳ khó làm. Ngoài ra, bất kể người ta biến đổi P(G) như thế nào (rắc rối hóa nó, dịch nó sang ngôn ngữ khác, vân vân), thì "con dấu" C(G) vẫn bị dính kèm.
Những điều trên có khả năng hiện thực hóa được nếu ta có bộ rắc rối hóa O. Ta bỏ vào trong P một đoạn mã C(G) nào đó để nhận dạng khách hàng G. (C(G) không làm gì cả, chỉ dùng để nhận dạng G.) Sau đó ta đưa cho khách hàng chương trình O(P). Chương trình O(P) giống hệt P+C(G), nhưng đã bị rắc rối đến mức khách hàng không thể hiểu được logic của nó, và vì thế không thể bỏ C(G) ra khỏi nó được. Dĩ nhiên còn nhiều chi tiết kỹ thuật và lý thuyết cần dùng cho việc này, nhưng về mặt trực quan thì có khả năng điều này có thể hiện thực hóa được nếu ta có O.