4.3. Tách và chia sẻ khóa
Cho đến nay, chúng ta đã xem xét các cách khác nhau để lưu trữ và quản lý các khóa bí mật kiểm soát bitcoin, nhưng chúng ta luôn đặt khóa ở một nơi—cho dù khóa trong két sắt, hoặc trong phần mềm, hoặc trên giấy. Điều này để lại cho chúng ta một điểm thất bại duy nhất. Nếu có vấn đề gì xảy ra với nơi lưu trữ duy nhất đó, thì chúng ta đang gặp rắc rối. Chúng ta có thể tạo và lưu trữ các bản sao lưu của tài liệu khóa, nhưng mặc dù điều này làm giảm nguy cơ khóa bị mất hoặc bị hỏng (tính khả dụng), nhưng lại làm tăng nguy cơ bị đánh cắp (bảo mật). Sự đánh đổi này có vẻ cơ bản. Chúng ta có thể lấy một phần dữ liệu và lưu trữ nó theo cách sao cho tính khả dụng và bảo mật tăng lên cùng lúc không? Đáng chú ý, câu trả lời là có, và một lần nữa nó lại là một thủ thuật sử dụng mật mã, được gọi là chia sẻ bí mật (secret sharing).
Đây là ý tưởng: chúng ta muốn chia khóa bí mật của chúng ta thành một số N mảnh. Chúng ta muốn làm điều đó theo cách mà nếu có K bất kỳ mảnh nào trong số đó, thì chúng ta có thể tái tạo lại bí mật ban đầu, nhưng với ít hơn K mảnh, chúng ta sẽ không thể học được gì về bí mật ban đầu.
Với yêu cầu nghiêm ngặt này, chỉ cần cắt bí mật thành nhiều mảnh sẽ không hiệu quả, bởi vì ngay cả một mảnh nhỏ cũng cung cấp một số thông tin về bí mật. Chúng ta cần một cái gì đó thông minh hơn. Và vì chúng ta không cắt rời từng mảnh bí mật, chúng ta gọi các thành phần riêng lẻ là “phần chia sẻ” (shares) thay vì các mảnh (pieces).
Giả sử chúng ta có N = 2 và K = 2. Điều đó có nghĩa là chúng ta đang tạo ra hai phần chia sẻ dựa trên bí mật và chúng ta cần cả hai phần chia sẻ để có thể tái tạo lại bí mật. Hãy gọi bí mật của chúng ta là S, chỉ là một số lớn (ví dụ: 128-bit). Chúng ta có thể tạo một số ngẫu nhiên 128 bit R và làm cho hai phần chia sẻ là R và S ⊕ R. (⊕ đại diện cho XOR theo chiều bit). Về cơ bản, chúng ta đã mã hóa S bằng đệm một lần và chúng ta lưu trữ khóa (R) và bản mã (ciphertext) (S ⊕ R) ở những nơi riêng biệt. Bản thân khóa và bản mã đều không cho chúng ta biết bất cứ điều gì về bí mật. Nhưng với hai chia sẻ, chúng ta chỉ cần XOR chúng với nhau để tái tạo lại bí mật.
Thủ thuật này hoạt động miễn là N và K giống nhau—chúng ta chỉ tạo N – 1 số ngẫu nhiên khác nhau cho N – 1 phần chia sẻ đầu tiên và chia sẻ cuối cùng sẽ là bí mật XOR’d với tất cả N – 1 phần chia sẻ khác. Nhưng nếu N lớn hơn K, điều này không còn hiệu quả nữa, và chúng ta cần một số đại số.
Hãy xem Hình 4.4. Đầu tiên, chúng ta tạo điểm (0, S) trên trục y, và sau đó vẽ một đường có độ dốc ngẫu nhiên qua điểm đó. Tiếp theo, chúng ta tạo ra các điểm trên dòng đó, bao nhiêu tùy thích. Nó chỉ ra rằng đây là một chia sẻ bí mật của S, với N là số điểm chúng ta tạo ra, và K = 2.
Tại sao phương pháp này hoạt động? Đầu tiên, với hai trong số các điểm được tạo ra, bạn có thể vẽ một đường thẳng qua chúng và xem vị trí nó chặn trục y. Điều đó mang lại cho bạn S. Nhưng nếu bạn chỉ cho một điểm duy nhất, nó không cho bạn biết gì về S, bởi vì độ dốc của đường được tạo ra một cách ngẫu nhiên. Mọi đường thẳng đi qua điểm của bạn đều có khả năng xảy ra như nhau và tất cả chúng sẽ cắt trục y tại các điểm khác nhau.
Chỉ có một điều tinh tế khác: để thực hiện phép toán, chúng ta phải thực hiện tất cả các môđun số học của chúng ta một số nguyên tố lớn P. Nó không cần phải bí mật, chỉ cần thực sự lớn. Và bí mật S phải nằm trong khoảng từ 0 đến P – 1. Vì vậy, bằng cách “tạo ra các điểm trên đường thẳng”, ý của chúng tôi là chúng ta tạo ra một giá trị ngẫu nhiên R, cũng nằm trong khoảng từ 0 đến P – 1 và các điểm chúng ta tạo ra là
HÌNH 4.4. Hình minh họa hình học của 2-out-of-N chia sẻ bí mật. S đại diện cho bí mật, được mã hóa dưới dạng một số nguyên (lớn). Đường có độ dốc được chọn ngẫu nhiên. Các điểm ngoài trục y (cụ thể là tọa độ y S + R, S + 2R, …) của chúng tương ứng với các phần chia sẻ. Bất kỳ hai điểm nào như vậy cũng đủ để tái tạo lại điểm trên trục y, và do đó là bí mật. Tất cả các số học được thực hiện theo mô đun một số nguyên tố lớn.
x = 1, y = (S + R) mod P
x = 2, y = (S + 2R) mod P
x = 3, y = (S + 3R) mod P
và như thế. Bí mật tương ứng với điểm x = 0, y = (S + 0 · R) mod P, chỉ là x = 0, y = S.
Phương pháp này chia sẻ một bí mật với K = 2 và bất kỳ giá trị nào của N. Nó đã khá tốt—ví dụ: nếu N = 4, bạn có thể chia khóa bí mật của mình thành bốn phần và đặt chúng trên bốn thiết bị khác nhau, để nếu ai đó đánh cắp bất kỳ thiết bị nào trong số đó, họ sẽ không biết gì về khóa của bạn. Tuy nhiên, ngay cả khi hai trong số các thiết bị đó bị phá hủy trong một trận hỏa hoạn, bạn có thể tạo lại khóa bằng cách sử dụng hai thiết bị còn lại. Vì vậy, như đã hứa, chúng ta đã tăng cường cả tính khả dụng và bảo mật.
Nhưng chúng ta có thể làm tốt hơn: chúng ta có thể chia sẻ bí mật với bất kỳ N và K nào miễn là K không nhiều hơn N. Để biết cách thực hiện, hãy xem lại Hình 4.4. Chúng ta đã sử dụng một đoạn thẳng thay vì một số hình dạng khác, bởi vì một đoạn thẳng là đa thức bậc 1. Vì vậy, để tái tạo một đoạn thẳng, chúng ta cần hai điểm và không ít hơn hai. Nếu chúng ta muốn K = 3, chúng ta sẽ sử dụng một parabol, là một hàm số bậc hai, hoặc một đa thức bậc 2. Cần có chính xác ba điểm để xây dựng một hàm bậc hai. Bảng 4.1 minh họa quy trình.
Có một công thức được gọi là nội suy Lagrange (Lagrange interpolation) cho phép bạn tạo lại đa thức bậc K – 1 từ bất kỳ K điểm nào trên đường cong của đa thức. Phương pháp này là một phiên bản đại số (và một sự tổng quát hóa) của trực giác hình học của việc vẽ một đường thẳng qua hai điểm bằng thước kẻ. Do đó, chúng ta có cách để lưu trữ bất kỳ bí mật nào dưới dạng N phần chia sẻ để chúng ta an toàn ngay cả khi kẻ thù học được đến K – 1 trong số chúng, đồng thời chúng ta có thể chịu được mất đến N – K của chúng.
BẢNG 4.1. TOÁN HỌC ĐẰNG SAU CHIA SẺ BÍ MẬT
Lưu ý: Biểu diễn bí mật thông qua một loạt điểm trên đường cong đa thức ngẫu nhiên bậc K – 1 cho phép tái tạo bí mật nếu và chỉ khi có ít nhất K điểm (“phần chia sẻ”).
Nhân tiện, không có điều nào trong số này là cụ thể đối với Bitcoin. Bạn có thể chia sẻ bí mật mật khẩu của mình ngay bây giờ và chia sẻ cho bạn bè hoặc đặt chúng trên các thiết bị khác nhau. Nhưng không ai thực sự làm điều này với những bí mật như mật khẩu. Sự thuận tiện là một lý do; lý do khác là có các cơ chế bảo mật khác có sẵn cho các tài khoản trực tuyến quan trọng, chẳng hạn như bảo mật hai yếu tố bằng cách sử dụng xác minh SMS (tin nhắn văn bản). Nhưng với Bitcoin, nếu bạn đang lưu trữ khóa cục bộ, bạn không có các tùy chọn bảo mật đó. Không có cách nào để khiến việc kiểm soát địa chỉ Bitcoin phụ thuộc vào việc nhận được tin nhắn SMS. Tình hình khác với ví trực tuyến, chúng ta sẽ xem xét trong phần tiếp theo. Nhưng không quá khác biệt—nó chỉ chuyển vấn đề sang một nơi khác. Rốt cuộc, nhà cung cấp ví trực tuyến sẽ cần một số cách để tránh một điểm lỗi duy nhất khi lưu trữ chìa khóa của họ.
Mật mã ngưỡng
Nhưng vẫn còn một vấn đề với việc chia sẻ bí mật: nếu chúng ta lấy một chiếc chìa khóa và chia nó ra theo cách này và sau đó chúng ta muốn sử dụng chìa khóa đó để ký một thứ gì đó, chúng ta vẫn cần phải tập hợp các chia sẻ lại với nhau và tính toán lại bí mật ban đầu để có thể để ký bằng chìa khóa đó. Điểm mà chúng ta tập hợp tất cả các phần chia sẻ lại với nhau vẫn là một điểm yếu duy nhất mà kẻ thù có thể đánh cắp chìa khóa.
Mật mã cũng có thể giải quyết vấn đề này: nếu phần chia sẻ được lưu trữ trên các thiết bị khác nhau, chúng ta có thể tạo chữ ký Bitcoin theo cách phi tập trung mà không cần tạo lại khóa cá nhân trên bất kỳ thiết bị nào. Đây được gọi là chữ ký ngưỡng (threshold signature). Trường hợp sử dụng tốt nhất là ví có bảo mật hai yếu tố, tương ứng với trường hợp N = 2 và K = 2. Giả sử rằng bạn đã định cấu hình ví của mình để phân chia tài liệu quan trọng giữa máy tính để bàn và điện thoại của bạn. Sau đó, bạn có thể bắt đầu thanh toán trên máy tính để bàn của mình, việc này sẽ tạo một phần chữ ký và gửi đến điện thoại của bạn. Sau đó, điện thoại của bạn sẽ thông báo cho bạn các chi tiết thanh toán—người nhận, số tiền, v.v.—và yêu cầu xác nhận của bạn. Nếu thông tin chi tiết được kiểm tra, bạn sẽ xác nhận và điện thoại của bạn sẽ hoàn thành chữ ký bằng cách sử dụng chia sẻ khóa cá nhân của nó và sau đó truyền phát giao dịch tới chuỗi khối. Nếu có phần mềm độc hại trên máy tính để bàn của bạn cố gắng ăn cắp bitcoin của bạn, nó có thể bắt đầu một giao dịch gửi tiền đến địa chỉ của kẻ tấn công, nhưng sau đó bạn sẽ nhận được cảnh báo trên điện thoại về một giao dịch mà bạn không cho phép và bạn sẽ biết có điều gì đó không ổn. Các chi tiết toán học đằng sau chữ ký ngưỡng rất phức tạp và chúng tôi sẽ không thảo luận về chúng ở đây.
Chữ ký ngưỡng
Chữ ký ngưỡng là một kỹ thuật mật mã để lấy một khóa duy nhất, chia nó thành các phần chia sẻ, lưu trữ chúng riêng biệt và ký các giao dịch mà không cần tạo lại khóa. Multisignatures là một tính năng của tập lệnh Bitcoin mà bạn có thể chỉ định rằng quyền kiểm soát địa chỉ được chia thành nhiều khóa độc lập. Mặc dù có một số khác biệt giữa hai kỹ thuật, cả hai đều tăng cường bảo mật bằng cách tránh các điểm lỗi đơn lẻ.
Đa chữ ký
Một lựa chọn hoàn toàn khác có sẵn để tránh một điểm thất bại duy nhất: đa chữ ký, mà chúng ta đã đề cập trong Chương 3. Thay vì lấy một khóa duy nhất và phân tách nó, tập lệnh Bitcoin trực tiếp cho phép bạn quy định rằng quyền kiểm soát đối với một địa chỉ được chia thành các khóa khác nhau. Các khóa này sau đó có thể được lưu trữ ở các vị trí khác nhau và các chữ ký được tạo ra riêng biệt. Tất nhiên, giao dịch đã hoàn thành, đã ký sẽ được xây dựng trên một số thiết bị, nhưng ngay cả khi kẻ thù kiểm soát thiết bị này, tất cả những gì cô ấy có thể làm là ngăn nó được phát sóng lên mạng. Cô ấy không thể tạo ra đa chữ ký hợp lệ của một số giao dịch khác mà không có sự tham gia của các thiết bị khác.
Ví dụ, giả sử rằng Andrew, Arvind, Ed, Joseph và Steven, tác giả của cuốn sách này, là đồng sáng lập của một công ty và công ty có rất nhiều bitcoin. Chúng tôi có thể sử dụng đa chữ ký để bảo vệ kho lưu trữ bitcoin lớn của mình. Mỗi người trong số năm người chúng tôi sẽ tạo một cặp khóa và chúng tôi sẽ bảo vệ kho lạnh của mình bằng cách sử dụng 3 trong số 5 đa chữ ký, có nghĩa là ba người trong chúng tôi phải ký để tạo một giao dịch hợp lệ.
Do đó, chúng tôi biết rằng chúng tôi tương đối an toàn nếu năm người chúng tôi giữ khóa riêng biệt và bảo mật chúng theo cách khác nhau. Một đối thủ sẽ phải thỏa hiệp ba trong số năm chìa khóa. Nếu một hoặc thậm chí hai người trong chúng tôi lừa đảo, họ không thể ăn cắp tiền của công ty, bởi vì bạn cần ít nhất ba chìa khóa để làm điều đó. Đồng thời, nếu một người trong chúng tôi làm mất chìa khóa hoặc bị xe buýt chạy qua và ví não của chúng tôi bị mất, những người khác vẫn có thể lấy lại tiền và chuyển chúng đến một địa chỉ mới và bảo vệ lại chìa khóa. Nói cách khác, đa chữ ký giúp bạn quản lý số lượng lớn tiền lưu trữ lạnh theo cách tương đối an toàn và yêu cầu nhiều người cùng hành động trước khi bất kỳ điều gì nghiêm trọng xảy ra.
Ở đây, chúng ta đã tạo động lực cho các chữ ký ngưỡng bằng cách giải thích cách kỹ thuật này có thể giúp đạt được bảo mật hai yếu tố (hoặc đa yếu tố) và kỹ thuật đa chữ ký bằng cách giải thích cách nó có thể giúp một nhóm cá nhân chia sẻ quyền kiểm soát đối với các quỹ cùng nắm giữ. Nhưng một trong hai công nghệ có thể áp dụng cho một trong hai trường hợp.