Bitcoin – Bài 2: Chống giao dịch giả mạo

Một giao dịch chuyển Bitcoin thường có các bước sau:

  1. Người chuyển ra lệnh chuyển tiền -> giao dịch phát sinh. Giao dịch này được ký điện tử bởi chủ tài khoản.
  2. Mạng máy tính sẽ xác thực giao dịch này, nếu đúng là chủ tài khoản ra lệnh, và người đó còn đủ Bitcoin để chuyển, thì giao dịch đó là hợp lệ và sẽ được đưa vào xử lý. (xử lý thế nào mình sẽ trình bày chi tiết sau).
  3. Xử lý thành công: giao dịch được chuyển sang trạng thái đã xác nhận. Máy thực hiện việc xử lý này sẽ được thưởng 25 bitcoin (tại thời điểm này, trước đây là 50). Vì vậy quá trình này còn được gọi là đào mỏ (mining), vì “tự dưng” được thêm 25 bitcoin.
  4. Chương trình tự cập nhật các giao dịch đã xác nhận, và thông báo cho chủ tài khoản biết là đã nhận bao nhiêu bitcoin, số dư mới là bao nhiêu. Người chuyển bị trừ tiền. Người nhận được cộng tiền.

Với từng bước ở trên, thuật toán được thiết kế để đảm bảo loại trừ các rủi ro gian lận, cụ thể:
Có những rủi ro như: giao dịch giả mạo, không phải từ tài khoản của mình (Bill Laden ra lệnh chuyển 1000 Bitcoin từ tài khoản Bill Gate tới tài khoản Al Queda). Giao dịch khống (không có tiền nhưng vẫn ra lệnh chuyển, hoặc tạo ra 1 giao dịch hợp lệ nhưng sử dụng nhiều lần), tự ghi tăng tài khoản của mình (hoặc 1 ai đó…)

Với 1 hệ thống tập trung, thì ngân hàng sẽ tạo cho chúng ta 1 tài khoản gồm username và password. Ai biết được 2 thông tin này (và có thể cả token nữa) thì sẽ thực hiện được giao dịch. Đó là giải pháp để đảm bảo chỉ có chủ tài khoản mới chuyển được tiền. Tuy nhiên, với 1 hệ thống phi tập trung như Bitcoin, sẽ không có ai đứng ra làm trung tâm để xác thực giao dịch, hơn nữa cũng không cần đăng ký thông tin cá nhân để có được tài khoản, không có máy chủ lưu trữ username/password của từng người, mà thông tin của ai sẽ được lưu trên máy người đó, thì giải quyết vấn đề này như thế nào?

Ký điện tử – giải pháp chống giả mạo

Chữ ký điện tử không phải là bản scan chữ ký tay rồi chèn vào file Word như nhiều người lầm tưởng. Ký điện tử phải đảm bảo những tính chất giống như ký thật: ngoài người chủ tài khoản, không ai có thể ký được và, khi đã ký rồi thì người khác có thể kiểm tra được dễ dàng tính hợp lệ của chữ ký đó.

Giải pháp phổ biến nhất hiện này là dùng mã khóa bất đối xứng. Và Bitcoin cũng sử dụng công nghệ này. Khi tạo 1 tài khoản Bitcoin, máy tính sẽ tạo ra 2 khóa tương ứng cho 1 tài khoản: 1 khóa bí mật (private key) và 1 khóa công khai (public key). Khóa bí mật thì bạn phải giữ gìn như password của mình vậy (có thể coi nó là 1 dạng password). Khóa công khai thì sẽ được đính kèm với thông điệp gửi đến người nhận.

Nếu anh A chuyển tiền cho anh B, anh A sẽ tạo 1 thông điệp

Chuyển từ: Số tài khoản của A

Chuyển tới: Số tài khoản của B

Số tiền: 1000 Bitcoin

Và dùng khóa bí mật của mình mã hóa thông điệp đó thành 1 đoạn mã và gửi cả thông điệp gốc (chưa mã hóa) + đoạn mã mới tạo ra + khóa công khai tới người nhận (là toàn bộ người tham gia mạng Bitcoin).

Như vậy, nội dung người nhận nhận được sẽ gồm 3 phần: (1) thông điệp gốc, (2) đoạn mã tương ứng với thông điệp gốc, (3) khóa công khai.

Người nhận (hay chính xác hơn là phần mềm của người nhận) sau khi nhận được nội dung trên sẽ tách nó thành 3 phần riêng biệt như trên, sau đó dùng khóa công khai (phần số 3) để kiểm tra xem đoạn mã (phần số 2) có phải là do “người anh em” khóa bí mật của mình tạo ra từ thông điệp gốc (phần số 1) hay không.

Biết được khóa công khai sẽ không biết được khóa bí mật, nhưng có thể kiểm tra được “sản phẩm” của khóa bí mật bằng cách kiểm tra đầu vào (thông điệp) và đầu ra (đoạn mã).

Chỉ có người giữ khóa bí mật (chủ tài khoản) mới có thể ký thông điệp (tạo ra đoạn mã).

Nếu thông điệp bị sửa đổi, thì đoạn mã sẽ không còn tương ứng với thông điệp nữa, và khóa công khai sẽ giúp phát hiện ra điều này, và giao dịch được xem là không hợp lệ. Như vậy, khóa công khai sẽ đảm bảo tính toàn vẹn và nguyên gốc của dữ liệu, đồng thời đảm bảo đúng là người sở hữu khóa bí mật tương ứng gửi đi.

Nhưng nếu 1 anh C muốn giả mạo anh A, tạo 1 thông điệp y như trên để chuyển tiền từ tài khoản của anh A tới anh B (hoặc của mình). Anh C dùng chính khóa bí mật của mình để ký tên, gửi kèm khóa công khai của mình tới những máy khác trong mạng. Các máy thực hiện việc kiểm tra, nhưng vì dùng khóa công khai của anh C để kiểm tra một thông điệp do chính anh C mã hóa (bằng khóa bí mật của C), nên kết quả kiểm tra là đúng luôn. Như vậy giao dịch giả mạo của anh C được xem là hợp lệ. Bitcoin loại trừ khả năng này bằng cách khi tạo số tài khoản cho 1 người thì lấy luôn 1 phần của khóa công khai của người đó làm số tài khoản. Như vậy, nếu anh C gửi khóa công khai của mình kèm với thông điệp giả mạo tài khoản anh A thì bản thân khóa công khai này và số tài khoản của anh A không khớp nhau, vì thế việc giả mạo sẽ dễ dàng bị phát hiện.

Trên đây là sơ lược về nguyên lý hoạt động của chữ ký điện tử sử dụng phương pháp mã hóa bất đối xứng. Mình sẽ trình bày chi tiết về mã hóa bất đối xứng bên dưới.

Vì máy tính chỉ xử lý được 0 và 1, nên tất cả các dữ liệu đều được đưa về dạng nhị phân. Ví dụ chữ a được chuyển thành 01100001. Vì thế, toàn bộ dữ liệu, dù là chữ, đều quy về số để tính toán. Vì thế các công thực toán học bên dưới mặc dù là sử dụng cho số nguyên, nhưng dữ liệu dạng chữ (như thông điệp trong giao dịch nêu trên) đều có thể xử lý bằng các hàm toán học này. (Và, nếu các bạn thắc mắc, đoạn bên dưới sử dụng số liệu trong hệ thập phân cho dễ hiểu, nhưng khi chạy trên máy tính cũng sẽ bị đưa hết về nhị phân)

(cảnh báo: bạn nên đứng dậy pha 1 ly café trước khi đọc phần dưới đây, vì nó có thể gây buồn ngủ :D).

  1. Chọn 2 số nguyên tố bất kỳ p và q. Hai số này càng lớn thì độ an toàn càng cao.
  2. Tính tích số n = p . q
  3. Tính φ(n) là số các số có 2 đặc tính: (i)nhỏ hơn n và (ii)nguyên tố cùng nhau với n (hay gọi cách khác: số cần tìm và n có ước số chung lớn nhất là 1). Ví dụ: số 9 có các số 1, 2, 4, 5, 7, 8 (tổng cộng 6 số) là nguyên tố cùng nhau với nó, vì thế φ(n) = 6.
  4. Công thức tính: với p là số nguyên tố thì [latex]φ(p^k) = p^{k-1}.(p-1)[/latex] . Ở ví dụ trên, [latex]φ(9) = φ(3^2) = 3^{2-1}.(3-1) = 3 . 2 = 6.[/latex]
  5. Vì n là hợp số (= p.q) nên φ(n) = φ(p)φ(q) = (p − 1)(q − 1). Công thức này gọi là Hàm số Ơ le (Euler).
  6. Chọn một số tự nhiên e sao cho 1 < e < φ(n) và e nguyên tố cùng nhau với φ(n)
  7. Tìm số d bất kỳ sao cho d . e chia cho φ(n) dư 1.

Khóa công khai là cặp số n và e.

Khóa bí mật là cặp số n và d.

Hàm mã hóa (dùng để kiểm tra chữ ký) là
[latex] c = m^e (Mod  n)[/latex]
Hàm giải mã (dùng để ký) là
[latex] m = c^d (Mod  n)[/latex]

Ký thông điệp và kiểm tra

  • Chọn p = 3 và q = 11
  • Tính n = p * q = 3 * 11 = 33
  • Tính φ(n) = (p – 1) * (q – 1) = 2 * 10 = 20
  • Chọn e sao cho 1 < e < φ(n) và e nguyên tố cùng nhau với 20. Chọn e = 7
  • Tính giá trị cho d sao cho  (d * e) % φ(n) = 1. Lấy d = 3 [(3 * 7) % 20 = 1]
  • Khóa công khai (e, n) => (7, 33)
  • Khóa bí mật (d, n) => (3, 33)

Giả sử thông điệp của chúng ta là 15. (số này phải nhỏ hơn n. Vì thế nên chọn p, q lớn để đảm bảo an toàn và mã hóa được mọi thông điệp).

Đoạn mã mà ta sẽ dùng để ký thông điệp sẽ là số dư của phép chia [latex]15^3[/latex] cho 33 = 9.

Ta sẽ gửi đến người nhận bộ 3 số (15, 9, (7, 33)) – tương ứng với (thông điệp, giá trị mã hóa, khóa công khai). (người nhận không hề biết đến con số 3 là số nằm trong giá trị khóa bí mật (3,33). Và từ dữ liệu nhận được, người nhận không thể tính toán ngược lại để ra kết quả bằng 3. Tất nhiên người nhận có thể mò nghiệm, nhưng với số d đủ lớn, thì việc mò ra khóa bí mật là bất khả thi.

Người nhận sẽ lấy tính số dư của phép chia [latex]9^7[/latex] chia 33. Nếu kết quả này bằng với giá trị thông điệp (15) thì chứng tỏ thông điệp này đã được ký hợp lệ và không bị sửa đổi. Nếu kết quả khác thì văn bản này được xem là không hợp lệ. Kết quả phép tính trên đúng bằng 15.

Thực ra bên trên là phương pháp ký sử dụng thuật toán RSA. Bitcoin thì dùng thuật toán Elliptic Curve Digital Signature Algorithm (ECDSA), về cơ bản thì cách hoạt động là như nhau, chỉ khác nhau công thức toán. Mình thấy công thức của RSA dễ hiểu hơn nên lấy làm ví dụ minh họa. Về mặt an toàn thì 2 thuật toán này đều rất an toàn và đang được sử dụng rộng rãi.

Như vậy vấn đề chống giao dịch giả mạo đã được giải quyết. Nhưng nếu anh A chỉ có 10 bitcoin, anh ta tạo 1 giao dịch hợp lệ chuyển hết số tiền này cho anh B. Liệu anh ta có thể copy lại giao dịch đó (hoàn toàn hợp lệ vì kiểm tra bằng khóa công khai sẽ thấy khớp) để chuyển cho anh B 5 lần (= 50 Bitcoin, vượt quá số tiền anh A có)? Bitcoin giải quyết vấn đề này (double spending) như thế nào? Xin xem tiếp hồi sau sẽ rõ 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *