2011-08-16 35 views
12

Tôi muốn thực hiện một cơ chế phản hồi trong ứng dụng của mình - về cơ bản, một điểm số. Các yêu cầu là:Có một thuật toán cho bỏ phiếu ẩn danh, có thể thay đổi, an toàn không?

  1. Tổng cộng tồn tại, và có thể được đọc
  2. Người dùng có thể thêm số điểm của mình vào tổng
  3. Một người sử dụng không thể thêm một số điểm thứ hai, nhưng có thể thay đổi số điểm ban đầu của mình, một lần nữa cập nhật tổng số bằng cách loại bỏ (trừ đi) số điểm ban đầu và thêm điểm mới.
  4. Nó là không thể để xác định những cuộc bỏ phiếu của người dùng cho là

Dường như này giáp (hoặc thậm chí chồng chéo) lý thuyết mật mã, nhưng tôi đã không thể tìm thấy bất cứ điều gì mà sẽ giải quyết này. Có ai có bất kỳ thuật toán cụ thể mà sẽ giải quyết này? Hoặc thậm chí các vector tìm kiếm bổ sung mà tôi có thể sử dụng để theo đuổi nó?

+1

Đây có phải là hệ thống phân tán không? Bởi vì nếu bạn có một bên đáng tin cậy (chẳng hạn như trang web bạn chạy), điều này là tầm thường để triển khai. Bạn cần phải xác định các thông số của hệ thống của bạn tốt hơn. –

+0

Câu hỏi này có lẽ phù hợp hơn với [mật mã stackexchange] (http://crypto.stackexchange.com/). – Wyzard

Trả lời

3

Nếu có ID ẩn danh, chẳng hạn như giá trị băm của giá trị mà người dùng cung cấp, thì bất kỳ ai có thể sản xuất thứ gì đó có cùng giá trị băm đều có thể sửa đổi phiếu bầu tương ứng.

Theo nghĩa này, vẫn còn ẩn danh, vì băm không tiết lộ nguồn. Thay vì liệt kê (userName, vote), list (hashValue, vote). Nếu có một số lo ngại rằng việc theo dõi hashValue có thể truy xuất được trên nhiều cuộc thăm dò, sau đó mã hóa một gói bổ sung cụ thể cho phiếu băm, nó không được tiết lộ công khai. Hoặc cho phép người dùng nhúng (ví dụ: prepend) vào chuỗi của họ để được băm, vì vậy họ vẫn đang sản xuất một lần gửi duy nhất.

2

Bạn không bao giờ có thể bỏ phiếu ẩn danh mà không có khả năng tin tưởng rằng các cá nhân ẩn danh sẽ không bỏ phiếu hai lần. Theo định nghĩa, ẩn danh thực sự đảm bảo rằng bạn không bao giờ có thể phát hiện bỏ phiếu trùng lặp.

Nếu thay vào đó bạn buộc người dùng tự nhận dạng mình, bạn có thể triển khai hệ thống bỏ phiếu ngăn chặn bỏ phiếu trùng lặp và cung cấp ẩn danh trong ngữ cảnh bỏ phiếu. Đây là một thuật toán đơn giản.

  1. Nhật ký người dùng. Hệ thống của bạn ngăn người dùng lấy nhiều tài khoản người dùng.
  2. Người dùng (không ẩn danh) chọn một vấn đề cần bỏ phiếu.
  3. Người dùng (không ẩn danh) bỏ phiếu.
  4. Hệ thống của bạn lưu trữ các mục sau:
    • Dấu hiệu cho thấy người dùng đã bỏ phiếu cho vấn đề đã chọn. Điều này ngăn ngừa bỏ phiếu trùng lặp.
    • Giá trị của phiếu bầu của người dùng đối với vấn đề đã chọn (đây là số điểm bạn đã đề cập). Giá trị này được lưu trữ mà không có tham chiếu đến người dùng bỏ phiếu.
    • Giá trị của điểm số của người dùng nếu họ bỏ phiếu cho một vấn đề. Bạn có thể cần điều này trở thành một giá trị tính

Nếu người dùng muốn thay đổi phiếu bầu của họ, họ đăng nhập, chọn vấn đề, sau đó không có bầu cử (hệ thống của bạn biết họ bình chọn bởi vì nó được lưu trữ này). Tại thời điểm này, họ có thể chọn lại vấn đề (chỉ dẫn bỏ phiếu của họ đã bị xóa) và bỏ phiếu.

Lưu ý rằng hệ thống của bạn sẽ cần phải trừ giá trị của phiếu bầu của người dùng khỏi số kiểm đếm cho vấn đề khi họ hủy lưu trữ.

+0

Làm thế nào là sự thật giấu tên thực sự đảm bảo bạn không bao giờ có thể phát hiện bỏ phiếu trùng lặp? Có phải bạn phải biết một người đã bỏ phiếu hay không và vì vậy khi bỏ phiếu đầu tiên, bạn sẽ biết phiếu bầu của họ là gì? – cmreigrut

+1

Nếu ai đó thực sự ẩn danh, thì không có cách nào để biết rằng cá nhân đó không có từ 2 tài khoản ẩn danh trở lên. – DwB

+0

Trong hệ thống bạn mô tả, làm cách nào để bạn bỏ phiếu của người dùng khỏi kiểm đếm khi họ bỏ phiếu? Bạn sẽ phải biết phiếu bầu ban đầu của họ là gì, điều này sẽ phá vỡ sự nặc danh. Nếu điểm 4.3 của bạn là như vậy và giá trị "được tính toán" nghĩa là nó bị cắt xén (nhưng vẫn có thể đảo ngược), thì bất kỳ ai có quyền truy cập vào mã nguồn (Ruby, Python) hoặc trình giải mã (Java, .Net) đều có thể theo dõi nó trở lại . Nếu không, không có tính năng "unvoting", hệ thống của bạn là hệ thống duy nhất có thể sử dụng ở đây trong số các câu trả lời. –

1

Bạn không cung cấp đủ thông tin về phiếu bầu hợp pháp, nhưng nếu đó là số nguyên, thì bạn chỉ có thể giữ tổng và cho phép nhiều phiếu bầu. Điều này làm việc bởi vì việc thay đổi một phiếu bầu từ A sang B có cùng tác dụng chính xác như bỏ phiếu A và sau đó bỏ phiếu (B - A).

0

Thực ra, bỏ phiếu trực tuyến khá phức tạp.

Nếu bạn muốn tiếp cận khắc nghiệt nhất đối với an toàn bầu cử, bạn có thể cần phải xem xét một cái gì đó như thế này:

https://docs.google.com/document/d/1SPYFAkVNjqDP4HOt_A_YGFZy-SFXVxHoN1hpLGNFKXI/pub

Nó là một thuật toán phân phối các bí mật cuộc bình chọn giữa các máy chủ n riêng biệt mà mỗi không thể phá vỡ bỏ phiếu ẩn danh của mình. Tất cả các máy chủ n sẽ phải hợp tác để phá vỡ tính ẩn danh, và nếu chỉ một trong các máy chủ bao gồm các bài hát của nó sẽ xóa tất cả dữ liệu mật mã, bí mật bỏ phiếu sẽ bị mất/ẩn vĩnh viễn.

Hệ thống cũng có thể đối phó với tái gửi phiếu, với một số hạn chế cố hữu đối với bất kỳ hệ thống an toàn cho bình chọn trực tuyến:

Đối với an ninh bình chọn trực tuyến luôn có một giới hạn cuối cùng ở chỗ nó là dễ bị phân tích lưu lượng . Ví dụ, nếu một ngày chỉ có một người bình chọn, có thể kết luận rằng bất kỳ cập nhật nào của kết quả biểu quyết đều là kết quả của việc bỏ phiếu của những người đó.

Hệ thống bỏ phiếu trực tuyến an toàn hoàn hảo sẽ được xem là bộ trộn phiếu bầu một lần. Phải mất một số phiếu bầu. Buffers chúng, và khi cuộc bỏ phiếu cuối cùng đã đóng, nó trộn tất cả chúng trong một lần. Điều này làm cho nó rất khó khăn để kết hợp một cuộc bỏ phiếu với một cử tri. Điều này có thể đạt được với công nghệ khá vững chắc.

Tuy nhiên, khi chúng tôi muốn cập nhật phiếu bầu, mọi thứ trở nên phức tạp hơn nhiều. Sẽ có một nhu cầu nội tại để đồng bộ hóa nếu chúng ta muốn tránh khả năng phân tích lưu lượng truy cập. Lý tưởng nhất là tất cả các cử tri sẽ phải gửi lại một bản cập nhật thường xuyên (ngay cả khi cập nhật của họ thực sự không phải là một bản cập nhật).

+0

Bạn nên cố gắng để có được công bố và phê bình nếu bạn muốn mọi người chấp nhận nó. – Emre

Các vấn đề liên quan