Month: January 2014

  • 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õ 🙂

  • Bitcoin – Bài 1: Những điều báo chí viết sai về Bitcoin

    Gần đây báo chí nói khá nhiều về bitcoin nhưng không đi vào chi tiết, khiến thông tin về Bitcoin thì có vẻ nhiều mà chẳng ai hiểu nó là cái gì. Đó cũng là động lực khiến mình viết (loạt) bài này.

    Trước khi đi vào chi tiết kỹ thuật, mình mô tả qua về Bitcoin và những điều lầm tưởng về nó.

    Bitcoin là tiền ảo với những đặc tính độc đáo. Trước tiên, nó là 1 hệ thống mạng ngang hàng, không có máy chủ. Mọi người đều có vai trò như nhau (nhưng máy có cấu hình mạnh hơn sẽ xử lý được nhiều hơn, sẽ nói ở phần sau). Bitcoin miner không phải là máy chủ. Nếu không có Bitcoin miner, hệ thống vẫn hoạt động bình thường vì chính chúng ta sẽ đóng vai trò miner. Tiền không được lưu trữ ở server (vì chẳng có server) mà lưu ở ngay máy tính cá nhân hoặc điện thoại của chúng ta.

    Vì là mạng ngang hàng, không có máy chủ, nên nó không thể bị đánh sập, bị cấm cửa (về mặt kỹ thuật)….

    Bitcoin không do 1 chính phủ hay công ty nào phát hành hoặc kiểm soát. Phát hành tiền và vận hành hệ thống là việc của tất cả những người tham gia, kể cả người dùng bình thường như bạn và tôi, tuân theo 1 thuật toán hết sức chặt chẽ. Tiền không thể phát hành tùy tiện (sẽ nói ở phần sau), và giao dịch được kiểm tra rất kỹ trước khi được chấp nhận (tất cả các máy trong mạng cùng góp sức để xác thực giao dịch).

    Nhiều bài báo nói việc Bitcoin không được 1 chính phủ đứng ra phát hành là 1 nhược điểm của Bitcoin. Đây là quan điểm hết sức sai lầm. Theo họ, được chính phủ đứng ra “đảm bảo” thì sẽ an toàn hơn. Trong lý thuyết tài chính, nếu công cụ tài chính do 1 chính phủ phát hành thì có thể coi đó là công cụ không có rủi ro (risk free). Thực tế thì ngược lại. Tôi không tin sự đảm bảo của chính phủ Việt Nam đối với tiền đồng. Tôi thích dự trữ vàng và USD hơn VND, vì tôi mất niềm tin với cung cách điều hành tiền tệ của ngân hàng nhà nước rồi. Nếu bạn là dân Zimbabwe chắc bạn cũng không thích thú gì khi cầm đồng tiền bản xứ được chính phủ “đảm bảo” đó, khi mỗi sáng thức dậy nó lại giảm giá trị đi vài lần. Bitcoin sẽ không bị rơi vào tình trạng đó, vì nó mang tính chất của vàng (hoặc của tiền bản vị vàng) nhiều hơn của tiền (tiền pháp định).

    Bitcoin không bị chính phủ kiểm soát không có nghĩa là nó không bị kiểm soát. Vấn đề là kiểm soát ở góc độ nào. Về góc độ minh bạch, chống gian lận, đảm bảo an toàn cho người dùng, thì giao dịch Bitcoin bị kiểm soát vô cùng ngặt nghèo bởi tất cả mọi người tham gia. Bất cứ 1 giao dịch nào không hợp lệ sẽ bị phát hiện và từ chối lập tức. Và bạn không cần phải tin bất cứ ai, mà chính máy tính của bạn sẽ thực hiện kiểm tra tính hợp lệ của giao dịch (sẽ trình bày ở bài sau nốt). Với giao dịch ngân hàng, bạn phải đặt niềm tin vào ngân hàng rằng “đời nào ngân hàng họ trừ tiền đối tác mà không chuyển cho mình”. Với Bitcoin, chương trình trên máy tính của bạn sẽ tự kiểm tra xem giao dịch có hợp lệ không, vì thế bạn không phải đặt niềm tin ở người khác mà chỉ tin chính mình thôi. Ngược lại, kiểm soát ở góc độ khống chế cung tiền để cho mục đích của 1 nhóm người (hay chính phủ) thì không thể thực hiện với Bitcoin. Nói chung, cái gì cần kiểm soát để an toàn và có lợi cho người dùng thì Bitcoin kiểm soát vô cùng chặt, còn kiểm soát có thể có hại cho người dùng thì Bitcoin không làm.

    Một hiểu lầm nữa là giao dịch Bitcoin diễn ra bí mật. Trong khi nhiều bài báo nói toàn bộ giao dịch được lưu trong 1 file (gọi là ledger) và mỗi máy tính đều tải về 1 bản (và vì thế công khai) thì họ lại nói giao dịch Bitcoin có tính ẩn danh, không tiết lộ thông tin người dùng, giống như tiền mặt. Nghe có vẻ mâu thuẫn. Thực tế, giao dịch Bitcoin hoàn toàn minh bạch, không thể giấu giếm và dễ dàng để truy vết luồng tiền. Cái bí mật chính là danh tính người dùng. Tài khoản Bitcoin không cần bạn khai báo bất cứ thông tin gì (không cần email, password, username, cmnd…). Vì vậy người ta có thể dễ dàng biết được tiền được chuyển từ tài khoản 001 đến tài khoản 050 nhưng không thể biết được ai sở hữu những tài khoản đó (và không biết ai chuyển tiền cho ai, về việc gì).

    “TS Võ Trí Thành, Phó Viện trưởng Viện Nghiên cứu kinh tế Trung ương (CIEM) cho rằng, giá trị của đồng tiền chính là lòng tin, được đảm bảo bởi một ngân hàng Trung ương, một thể chế chính trị, một nền kinh tế nào đó”

    Vâng, giá trị của 1 đồng tiền chính là lòng tin. Nhưng thay vì tin vào ngân hàng trung ương, thể chế chính trị… là những nơi tôi không chắc chắn có đáng tin hay không, thì tôi tin vào 1 thuật toán minh bạch và có thể kiểm chứng.

    VTV có 1 phóng sự về Bitcoin, trong đó có nói:

    Bitcoin là sản phẩm của 1 nhóm người còn chưa xác định được danh tính. Nó không được điều hành bởi bất kỳ 1 chính phủ hay 1 ngân hàng nào.

    Vụ “không được điều hành bởi bất kỳ 1 chính phủ hay ngân hàng nào” là 1 lợi thế chứ không phải nhược điểm của Bitcoin, như tôi nói ở trên. Còn đề cập đến việc tác giả của nó (có nick Satoshi Nakamoto) vẫn còn chưa xác định được danh tính có lẽ VTV muốn ám chỉ Bitcoin có thể chưa đựng điều gì mờ ám, hay không an toàn vì bị Satoshi kiểm soát/giật dây.

    Nếu các bạn đã xem phim The Social Network hẳn biết anh em nhà Winklevosses, là người có ý tưởng về mạng xã hội mà sau đó Mark Zuckerberg “chôm ý tưởng” để phát triển thành Facebook. Anh em này đã đầu tư khoảng 1 triệu USD vào Bitcoin từ khi nó chỉ có giá 9 USD (bây giờ là hơn 900 USD, tăng 100 lần). Khi được hỏi về việc Bitcoin được tạo ra bởi Satoshi, 1 nhân vật còn bí ẩn (đúng những gì VTV muốn đề cập), họ trả lời:

    “We don’t need to know him because it’s based on … trust in cryptography, not trust in individual.”

    Tạm dịch: Bọn tao cóc cần biết nó là ai, vì Bitcoin dựa trên niềm tin vào mật mã học chứ không phải dựa trên niềm tin vào 1 người cụ thể.

    Quả thực, vai trò hiện giờ của Satoshi (và các core developer khác) cũng không khác gì những người dùng bình thường khác. Vì thế, không cần phải lo về Satoshi hoặc bất cứ tổ chức nào (vì chẳng có tổ chức nào đứng sau Bitcoin cả).

    Kỳ tiếp theo mình sẽ nói về cách thức vận hành, xác thực giao dịch, bảo mật, đào mỏ … của Bitcoin.