Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 69 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
69
Dung lượng
1,37 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN - VŨ DUY HIẾN VỀ TIỀN ĐIỆN TỬ, CRYPTOCURRENCY VÀ BITCOIN LUẬN VĂN THẠC SĨ KHOA HỌC Hà Nội – Năm 2015 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN - VŨ DUY HIẾN VỀ TIỀN ĐIỆN TỬ, CRYPTOCURRENCY VÀ BITCOIN Chuyên ngành: Cơ sở Toán cho Tin học Mã số: 60460110 LUẬN VĂN THẠC SĨ KHOA HỌC NGƯỜI HƯỚNG DẪN KHOA HỌC: TS TƠN QUỐC BÌNH XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ CHỦ TỊCH HỘI ĐỒNG CHẤM LUẬN VĂN THẠC SĨ KHOA HỌC (Ký ghi rõ họ tên) CÁN BỘ HƢỚNG DẪN KHOA HỌC PGS TS Nguyễn Hữu Ngự Hà Nội – Năm 2015 (Ký ghi rõ họ tên) TS Tơn Quốc Bình LỜI CAM ĐOAN Tơi tên là: Vũ Duy Hiến Ngày sinh: 04 tháng 09 năm 1989 Học viên cao học khóa: 2012-2014 Chuyên ngành: Cơ sở Toán cho Tin học Trường Đại học Khoa học Tự nhiên – Đại học Quốc gia Hà Nội Tên đề tài luận văn: Về tiền điện tử, CryptoCurrency Bitcoin Cán hướng dẫn khoa học: TS Tôn Quốc Bình Tơi xin cam đoan luận văn cơng trình nghiên cứu riêng tơi, kết nghiên cứu độc lập, không chép chưa công bố nội dung đâu; số liệu, trích dẫn luận văn thích có nguồn gốc rõ ràng, minh bạch Tơi xin chịu hoàn toàn trách nhiệm lời cam đoan Hà Nội, ngày 11 tháng 11 năm 2015 Học viên Vũ Duy Hiến i LỜI CẢM ƠN Lời đầu tiên, em xin gửi lời cảm ơn sâu sắc tới TS Tơn Quốc Bìnhngười thầy ln tận tình giúp đỡ em định hướng nghiên cứu suốt trình làm luận văn Đồng thời, thầy người truyền đạt cho em nhiều kiến thức bổ ích lĩnh vực ngân hàng, tiền tệ, an tồn thơng tin Em xin cảm ơn thầy, cô công tác giảng dạy Bộ môn Tin học – Khoa Toán-Cơ-Tin học trường Đại học Khoa học Tự nhiên Hà Nội Trong suốt trình học tập từ bậc đại học bậc cao học, em thầy, cô truyền đạt nhiều tri thức quí báu Em xin cảm ơn gia đình, người thân bạn bè em giúp đỡ hỗ trợ cho em nhiều suốt thời gian qua Hà Nội, ngày 11 tháng 11 năm 2015 Học viên Vũ Duy Hiến ii MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH MỤC HÌNH VẼ, BẢNG BIỂU v MỞ ĐẦU CHƢƠNG 1: TỔNG QUAN VỀ TIỀN ĐIỆN TỬ, CRYPTOCURRENCY VÀ BITCOIN 1.1 Giới thiệu tiền điện tử, Cryptocurrency Bitcoin 1.2 Các vấn đề tiền điện tử Bitcoin .6 CHƢƠNG 2: CƠ SỞ MẬT MÃ HỌC CỦA TIỀN ĐIỆN TỬ BITCOIN 2.1 Chữ ký số hệ mật đường cong Eliptic (ECSDA) 2.1.1 Đường cong Elliptic 2.1.2 Chữ ký số hệ mật đường cong Elliptic 12 2.2 Hàm băm 15 2.2.1 Tổng quan hàm băm 15 2.2.2 Hàm băm SHA-256 17 2.2.3 Hàm băm RIPEMD-160 21 2.3 Cây băm Merkle 24 2.3.1 Bài toán xác thực liệu 24 2.3.2 Cây băm Merkle xác thực liệu băm Merkle .25 2.4 Hashcash 27 2.4.1 Khái niệm 27 2.4.2 Hashcash ngăn chặn thư rác .28 2.4.3 Hashcash chống lại công từ chối dịch vụ 29 iii 2.4.4 Đánh giá chi phí tính tốn Hashcash 30 2.5 TimeStamp 31 2.6 Base 58 .32 CHƢƠNG 3: NGUYÊN LÝ HOẠT ĐỘNG CỦA HỆ THỐNG TIỀN ĐIỆN TỬ NGANG HÀNG BITCOIN 34 3.1 Mô tả hoạt động hệ thống tiền điện tử ngang hàng Bitcoin 34 3.1.1 Định nghĩa thành phần hệ thống 34 3.1.2 Quy trình thực tốn hệ thống tiền điện tử ngang hàng Bitcoin 34 3.2 Những giải pháp cho vấn đề tiền điện tử Bitcoin 35 3.2.1 Vấn đề tạo đồng tiền điện tử Bitcoin 35 3.2.2 Vấn đề xác định quyền sở hữu đồng tiền điện tử Bitcoin 37 3.2.3 Vấn đề chuyển quyền sở hữu đồng tiền điện tử Bitcoin 40 3.2.4 Vấn đề chia nhỏ giá trị đồng tiền Bitcoin giao dịch sử dụng nhiều đồng tiền Bitcoin .46 3.2.5 Vấn đề an toàn bảo mật hệ thống tiền điện tử ngang hàng Bitcoin 47 KẾT LUẬN 52 TÀI LIỆU THAM KHẢO 55 PHỤ LỤC 57 iv DANH MỤC HÌNH VẼ, BẢNG BIỂU Hình 2.1-Phép cộng đường cong Elliptic Hình 2.2-Phép nhân đôi đường cong Elliptic 10 Hình 2.3-Cây băm Merkle node 26 Hình 2.4-Xác thực liệu sử dụng băm Merkle node 27 Hình 3.1-Node gốc băm Merkle lưu trữ thông tin giao dịch 36 Hình 3.2-Cấu trúc băm Merkle lưu trữ thông tin n giao dịch .42 Hình 3.3-Cấu trúc TimeStamp sử dụng kỹ thuật băm 42 Hình 3.4-Cấu trúc khối Block TimeStamp 43 Hình 3.5-Cơ chế ghi nhận lịch sử giao dịch 44 Hình 3.6-Cơ chế thực giao dịch sử dụng Bitcoin 46 Bảng 1.1-Một số tiền điện tử Cryptocurrency điển hình Bảng 2.1-Bảng mã Base58 32 Bảng 3.2-Một số loại Version byte phổ biến 37 v MỞ ĐẦU Tiền tệ đời giúp cho hoạt động trao đổi, sản xuất lưu thơng hàng hố xã hội phát triển Tất đồng tiền thức từ trước tới nay, dù tiền giấy hay tiền điện tử nhà nước tổ chức uy tín phát hành quản lý Lý vấn đề có nhà nước, phủ tổ chức uy tín đứng đảm bảo giá trị cho đồng tiền phát hành tạo niềm tin cho người sử dụng chúng Tuy nhiên, quan điểm bị thay đổi hoàn toàn tiền điện tử Bitcoin đời Bitcoin hoạt động dựa sở lý thuyết mật mã giao thức mạng ngang hàng (Peer-to-Peer); tất node mạng tạo đồng tiền khơng có tổ chức, phủ hay nhà nước phát hành quản lý; giao dịch sử dụng Bitcoin không cần đến bên thứ ba tin cậy làm trung tâm xác thực Mặc dù vậy, Bitcoin mang đầy đủ tính chất quan trọng tiền tệ: sử dụng để mua bán hàng hóa dịch vụ thực giao dịch tốn, khơng lưu vết thơng tin định danh sở hữu đồng tiền, chuyển đổi giá trị dễ dàng cộng đồng chấp nhận Bitcoin Trên giới, có số quốc gia: Đức, Hy Lạp, Venezuela số tổ chức, doanh nghiệp chấp nhận tiền điện tử Bitcoin làm phương tiện toán đặc điểm ưu việt Bên cạnh đó, có số quốc gia Việt Nam, Thái Lan, Iceland…không chấp nhận Bitcoin đồng tiền hợp pháp Điều hoàn toàn tự nhiên giống loại tiền tệ thơng thường, Bitcoin chấp nhận có giá trị cộng đồng tin tưởng sử dụng chúng Tại quốc gia khơng chấp nhận Bitcoin, phủ dừng lại mức khuyến nghị người dân không nên đầu cơ, nắm giữ sử dụng Bitcoin chưa đưa sở khoa học làm cho khuyến nghị Cơ sở khoa học hệ thống tiền điện tử ngang hàng Bitcoin Satoshi (một nhóm nhà phát triển ẩn danh) công bố vào năm 2009 tài liệu tên, nhiên tài liệu đưa ý tưởng hoàn toàn Với mong muốn nghiên cứu làm rõ sở khoa học hình thành nên đồng tiền điện tử Bitcoin nguyên lý hoạt động hệ thống tiền điện tử ngang hàng Bitcoin, lựa chọn đề tài: “Về tiền điện tử, Cryptocurrency Bitcoin” cho luận văn Bố cục luận bao gồm phần mở đầu, ba chương chính, phần kết luận, phụ lục tài liệu tham khảo Nội dung ba chương tổ chức sau: Chương I: Tổng quan tiền điện tử, Cryptocurrency Bitcoin Chương II: Cơ sở mật mã học tiền điện tử Bitcoin Chương III: Nguyên lý hoạt động hệ thống tiền điện tử ngang hàng Bitcoin Sau phần trình bày nội dung chương CHƢƠNG 1: TỔNG QUAN VỀ TIỀN ĐIỆN TỬ, CRYPTOCURRENCY VÀ BITCOIN 1.1 Giới thiệu tiền điện tử, Cryptocurrency Bitcoin Theo quan điểm chủ nghĩa Mác-Lênin, tiền tệ hàng hoá đặc biệt, dùng làm vật ngang giá chung thống cho hàng hoá khác, thể chung giá trị thể lao động xã hội; đồng thời tiền tệ biểu quan hệ sản xuất người sản xuất hàng hố, q trình phát triển lâu dài trao đổi hàng hố tạo Cịn theo nhà kinh tế đại: Tiền định nghĩa chấp nhận chung việc tốn để nhận hàng hoá, dịch vụ việc trả nợ Bản chất tiền tệ thể rõ qua hai thuộc tính giá trị giá trị sử dụng Trong đó: - Giá trị tiền theo quan điểm triết học Mác-Lênin công sức lao động tích tụ tạo kết tinh vào thân đồng tiền - Khác với vật chất thông thường, giá trị sử dụng tiền nằm khả thỏa mãn nhu cầu trao đổi hàng hóa xã hội, nhu cầu sử dụng làm vật trung gian trao đổi Giá trị sử dụng loại tiền tệ xã hội quy định: chừng xã hội thừa nhận vai trò làm vật trung gian trao đổi loại tiền tệ chừng giá trị sử dụng với tư cách tiền tệ cịn tồn [1] Tiền tệ trải qua nhiều hình thái đa dạng khác lịch sử hình thành phát triển Trước đồng tiền kim loại tiền giấy xuất hiện, người sử dụng nhiều thứ khác với vai trò loại tiền để trao đổi hàng hóa Chẳng hạn, số nơi giới, người ta sử dụng cá mập tiền Ở nhiều nơi khác, tiền lông chim sặc sỡ vỏ sị q hiếm; có nơi người ta cịn dùng cọng lông đuôi voi để làm tiền Với phát triển nhanh xã hội đại ngày với bùng nổ mạnh mẽ lĩnh vực Công nghệ thông tin, tiền sử dụng dạng giá trị số lưu trữ máy tính thiết bị điện tử Người sử dụng thực giao - Nếu thực hành vi (1), mức độ tin tưởng hệ thống giảm giá trị đồng tiền mà người sở hữu - Nếu thực hành vi (2), dễ dàng kiếm đồng tiền hợp lệ sở hữu nhiều tiền tất người hệ thống b Trƣờng hợp kẻ công thay đổi lịch sử giao dịch [11] Như biết, chuỗi lịch sử giao dịch hợp lệ chuỗi Block dài Kẻ công muốn thay đổi lịch sử giao dịch khối Block từ khối này, kẻ cơng cần phải nhanh chóng tạo chuỗi thay dài chuỗi hợp lệ Tuy nhiên kẻ công thay đổi giao dịch mà bên gửi Chúng ta mô tả xác suất mà kẻ công tạo chuỗi thay dài nhanh chuỗi hợp lệ từ khoảng cách z khối Block sau: + p xác suất node tin cậy nối thêm khối + q xác suất node công nối thêm khối + qz xác suất kẻ cơng bắt kịp từ khoảng cách z khối cho bởi: p ≤ q qz = (q/p)z p > q - Trường hợp p ≤ q: tương tự trường hợp a - Trường hợp p > q: xác suất giảm theo cấp số nhân số khối Block mà kẻ công phải bắt kịp tăng lên Như vậy, node công muốn tạo chuỗi thay bắt kịp chuỗi hợp lệ khoảng thời gian xác định node cơng phải nối thêm thành công z khối so với node tin cậy Nghĩa khoảng thời gian đó, node tin cậy nối thêm n khối node công cần 48 nối thêm (n+z) khối Điều xảy phụ thuộc vào mức độ may mắn kẻ công khoảng cách z c Xác định thời điểm ngƣời nhận chấp nhận giao dịch [11] Giả sử người gửi kẻ công, thực giao dịch gửi tiền người nhận lại cố gắng tạo chuỗi song song dài chuỗi hợp lệ tại, chuỗi song song có chứa giao dịch mà chuyển lại tiền cho Để chống lại điều này, người nhận thực hai việc sau: - Chỉ gửi địa số nhận tiền trước giao dịch bắt đầu người nhận gửi trước người gửi chuẩn bị chuỗi song song thích hợp trước thực giao dịch người nhận yêu cầu - Đợi giao dịch hai người xuất khối Block thuộc chuỗi lịch sử giao dịch dài sau khối Block có z khối Block nối thêm vào chuỗi lịch sử giao dịch Vì để ghi nhận khối Block cần khoảng thời gian trung bình định nên tốc độ thực kẻ công để bắt kịp chuỗi thực mô tả phân phối Poisson với: = z(q/p) Với p xác suất node tin cậy nối thêm khối q xác suất node công nối thêm khối Để tính xác suất mà kẻ cơng kéo dài chuỗi song song bắt kịp chuỗi hợp lệ, nhân hàm mật độ Poisson với xác suất mà bắt kịp từ điểm đó: Biến đổi biểu thức ta được: 49 50 Như với tính tốn trên, thu kết sau: q = 0.1 q = 0.3 Để P < 0.1% z P z P q z 1 0.10 0.2045873 0.1773523 0.15 0.0509779 10 0.0416605 0.20 11 0.0131722 15 0.0101008 0.25 15 0.0034552 20 0.0024804 0.30 24 0.0009137 25 0.0006132 0.35 41 0.0002428 30 0.0001522 0.40 89 0.0000647 35 0.0000379 0.45 340 0.0000173 40 0.0000095 0.0000046 45 0.0000024 10 0.0000012 50 0.0000006 Căn vào kết tính tốn này, khuyến nghị đưa để chấp nhận giao dịch người gửi người nhận cần phải đợi sáu Block thêm vào chuỗi lịch sử giao dịch sau Block chứa giao dịch 51 KẾT LUẬN Các kết đạt đƣợc - Luận văn tập trung nghiên cứu tìm hiểu sở khoa học hình thành nên đồng tiền điện tử Bitcoin - Luận văn làm rõ giải pháp mà Satoshi sử dụng để giải năm vấn đề mà Bitcoin phải đối mặt để trở thành đồng tiền - Bên cạnh đó, luận văn mô tả chi tiết nguyên lý hoạt động hệ thống tiền điện tử ngang hàng Bitcoin bao gồm: phương thức lưu trữ Bitcoin, phương thức thiết lập phương thức xác thực giao dịch tốn sử dụng Bitcoin Các vấn đề cịn tồn tiền điện tử Bitcoin a Về số lƣợng phát hành Hệ thống tiền điện tử Bitcoin đưa sách hạn chế số lượng Bitcoin phát hành theo quy tắc sau [6]: - Giá trị đồng tiền Bitcoin phát hành 50 BTC, sau bốn năm nghĩa sau 210.000 Block giá trị giảm nửa - Đến năm 2140, mà giá trị đồng tiền Bitcoin phát hành xấp xỉ gần Satoshi (đơn vị Bitcoin nhỏ nhất) số lượng Bitcoin tối đa phát hành 21 triệu Điều không phù hợp với tính chất tiền tệ thơng thường lượng tiền phát hành xã hội tương đương với tăng trưởng tổng sản phẩm xã hội Tuy nhiên sách riêng biệt hệ thống tiền điện tử Bitcoin, không ảnh hưởng đến điều kiện cần đồng tiền 52 b Về vấn đề an toàn bảo mật - Vấn đề ẩn danh ngƣời dùng: hệ thống tiền điện tử Bitcoin đảm bảo tính ẩn danh người dùng giao dịch tiền điện tử Bitcoin dễ dàng sử dụng làm công cụ rửa tiền thực hành vi phạm pháp Nếu người nhóm người đánh cắp khóa người dùng chúng sử dụng khóa bí mật để tạo giao dịch chuyển toàn tiền người dùng vào địa chúng mà khơng truy vết Điều xảy với sàn giao dịch Bitcoin lớn giới Mt.Gox Nhật Bản vào tháng năm 2014 khiến cho sàn giao dịch thất thoát 850.000 Bitcoin tương đương 475 triệu USD phải đóng cửa sau đó; tiếp tháng năm 2014 ngân hàng Flexcoin Canada chuyên nhận tiền gửi Bitcoin phải đóng cửa bị tin tặc đáng cắp 896 Bitcoin xấp xỉ 600.000 USD - Vấn đề thời gian xác thực giao dịch: trình bày, Block chứa giao dịch trung bình khoảng 10 phút để ghi nhận vào chuỗi lịch sử giao dịch Như để chấp nhận giao dịch, người nhận phải đợi tới có sáu Block nối thêm sau Block chứa giao dịch nghĩa người nhận phải đợi trung bình: 6*10 phút = 60 phút Rõ ràng thời gian lớn, đặc biệt với giao dịch có giá trị thấp Tuy nhiên với giao dịch có giá trị thấp xác suất xảy trường hợp người gửi gian lận thấp! - Vấn đề không gian lƣu trữ lịch sử giao dịch: số người sử dụng tiền điện tử Bitcoin hạn chế Tuy nhiên mong muốn hệ thống tiền điện tử Bitcoin sử dụng rộng rãi toàn giới nghĩa 10 phút có tới hàng trăm nghìn chí hàng triệu giao dịch thực kích thước Block lớn Giả sử Block có kích thước khoảng 20MB năm kích thước chuỗi lịch sử giao dịch tăng thêm khoảng: 20MB *6*24*365 = TB, số lớn! 53 Đề xuất định hƣớng phát triển Với phát triển mạnh mẽ lĩnh vực Công nghệ thông tin mức độ phổ biến thiết bị di động thông minh, tiền điện tử dự đoán dần thay cho tiền tệ thông thường tương lai Dựa việc kế thừa phát triển ý tưởng hệ thống tiền điện tử ngang hàng Bitcoin, giải pháp xây dựng hệ thống tiền điện tử cho phủ quốc gia đề xuất sau: - Sử dụng hạ tầng khóa cơng khai để tạo địa số lưu trữ đồng tiền thực giao dịch điện tử - Sử dụng Hashcash làm sở phát hành điều tiết lượng tiền xã hội cho phù hợp với tình hình tăng trưởng kinh tế, sách tiền tệ quốc gia giảm thiểu lạm phát - Sử dụng TimeStamp làm công cụ ghi nhận lịch sử giao dịch Tuy nhiên Ngân hàng Trung Ương phải kiểm soát lưu trữ liệu lịch sử giao dịch số máy chủ, đồng thời Ngân hàng Trung Ương tổ chức phủ ủy nhiệm đảm nhiệm vai trị trung tâm xác thực giao dịch điện tử Mặc dù điều ngược lại với tư tưởng “ngang hàng” hệ thống tiền điện tử Bitcoin Ngân hàng Trung Ương khơng kiểm sốt lưu trữ liệu lịch sử giao dịch khơng thể đảm bảo tính cơng bằng, minh bạch cho giao dịch tạo tin tưởng cho người sử dụng - Tăng cường an ninh đảm bảo an toàn cho hệ thống lưu trữ liệu lịch sử giao dịch Ngân hàng Trung Ương quản lý 54 TÀI LIỆU THAM KHẢO Tiếng Việt Nguyễn Văn Tiến (2011), Giáo trình Tiền tệ Ngân hàng, NXB Thống kê Trịnh Nhật Tiến (2009), Giáo trình An tồn liệu, NXB ĐHQGHN Tiếng Anh Adam Back (1997), Hashcash, http://www.cypherspace.org/hashcash Adam Back (2002), Hashcash - A Denial of Service Counter - Measure, www.hashcash.org/papers/hashcash.pdf Bitcoin Wiki 2015 “Base58Check_encoding” Truy cập ngày 17/09 https://en.bitcoin.it/wiki/Base58Check_encoding Bitcoin Wiki 2015 “Controlled_supply” Truy cập ngày 17/09 https://en.bitcoin.it/wiki/Controlled_supply Bitcoin Wiki 2015 “Technical background of version Bitcoin addresses” Truy cập ngày 17/09 https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses Bitcoin Wiki 2015 “Transaction” Truy cập ngày 17/09 https://en.bitcoin.it/wiki/Transaction Ralph Charles Merkle (1979), Secrecy, authentication and public key systems, Technical Report No 1979-1 Stanford University 10 S Haber, W.S Stornetta (1991), How to time-stamp a digital document, Journal of Cryptology, vol 3, no 2, pages 99-111 11 Satoshi Nakamoto (2009), Bitcoin: A Peer-to-Peer Electronic Cash System, http://www.bitcoin.org/bitcoin.pdf 12 Shahdad Naghshpour (2013), The fundamental of Money and Finance System, Business Expert Press 55 13 Wei Dai (1998), b-money, http://www.weidai.com/bmoney.txt 14 Wikipedia 2015 “Base58” Truy cập ngày 17/09 https://en.wikipedia.org/wiki/Base58 15 Wikipedia 2015 “Hashcash” Truy cập ngày 17/09 https://en.wikipedia.org/wiki/Hashcash 16 Wikipedia 2015 “Proof-of-work system” Truy cập ngày 17/09 https://en.wikipedia.org/wiki/Proof-of-work_system 17 Wikipedia 2015 “TimeStamp” Truy cập ngày 17/09 https://en.wikipedia.org/wiki/Timestamp 18 William Stallings (2011), Cryptography And Network Security 5th Edition, Prentice Hall Pearson Education, Inc 56 PHỤ LỤC Chƣơng trình cài đặt nhị phân Merkle sử dụng mảng chiều ngôn ngữ C# 1.1 Mô tả yêu cầu - Yêu cầu toán: xây dựng băm nhị phân đầy đủ Merkle lưu trữ giá trị n (có dạng 2m) tệp tin - Dữ liệu đầu vào: tệp "data.txt" có cấu trúc sau: Dịng đầu tiên: số tệp tin n cần lưu trữ n dòng tiếp theo: dòng chuỗi bytes biểu diễn liệu tệp tin - Đầu ra: tệp "tree.txt lưu trữ băm nhị phân đầy đủ Merkle với: Dòng đầu tiên: giá trị node gốc (node mức 0) Dòng thứ i: chứa giá trị node mức thứ i, node phân cách dấu cách 1.2 Mã nguồn chƣơng trình using using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Security.Cryptography; System.IO; namespace MerkleTree { class Program { private static int n; // Số node = số tệp tin private static SHA256 hashValue = SHA256Managed.Create(); //giá trị băm private static Byte[,] b; // Khai báo mảng lưu trữ giá trị node cho // Đọc số node private static void readNumberNode() { StreamReader sr = File.OpenText("data.txt"); n = Convert.ToInt16(sr.ReadLine()); sr.Close(); } 57 // Đọc giá trị Yj khởi tạo giá trị node private static void readFile() { StreamReader sr = File.OpenText("data.txt"); n = Convert.ToInt16(sr.ReadLine()); Byte[] buff; int i, j; for (i = n-1; i < 2*n-1; i++) { buff = new UTF8Encoding(true).GetBytes(sr.ReadLine().ToString()); buff = hashValue.ComputeHash(buff); //Khởi tạo giá trị cho node j SHA-256(Yj) for (j = 0; j < 32; j++) b[i,j] = buff[j]; } sr.Close(); } // Gán giá trị cho node lại private static void calculate() { Byte[] buff; Byte[] buff1 = new Byte[32]; Byte[] buff2 = new Byte[32]; int i, j; // Giá trị node i tính SHA-256(node 2i+1 || node 2i+1) for (i = n - 2; i >= 0; i ) { for (j = 0; j < 32; j++) buff1[j] = b[2 * i + 1, j]; for (j = 0; j < 32; j++) buff2[j] = b[2 * i + 2, j]; buff = new Byte[buff1.Length + buff2.Length]; Buffer.BlockCopy(buff1, 0, buff, 0, buff1.Length); Buffer.BlockCopy(buff2, 0, buff, buff1.Length, buff2.Length); buff = hashValue.ComputeHash(buff); for (j = 0; j < 31; j++) b[i, j] = buff[j]; } } // Kiểm tra số lũy thừa private static bool checkPow(int n) { int i = n; while(true) { if (i == 1) return true; else if (i > && i % == 0) i = i / 2; else return false; } 58 } // Ghi file chứa private static void { StreamWriter sr int i, j; for (i = 0; i < { liệu Merkle writeFile() = File.CreateText("tree.txt"); * n - 1; i++) Console.Write("("); for (j = 0; j < 32; j++) { Console.Write(String.Format("{0:X2}", b[i, j])); sr.Write(String.Format("{0:X2}", b[i, j])); } Console.Write(") "); sr.Write(" "); if (checkPow(i+2) == true) { Console.WriteLine(); sr.WriteLine(); } } sr.Close(); } static void Main(string[] args) { readNumberNode(); // Xin cấp phát cho mảng b[,] b = new Byte[2*n-1,32]; readFile(); calculate(); writeFile(); Console.ReadKey(); } } } 59 Chƣơng trình mơ chuỗi tốn khó Hashcash phƣơng thức tìm lời giải cho tốn khó đƣợc viết ngôn ngữ C# 2.1 Mô tả yêu cầu - Dữ liệu đầu vào: Mỗi Block chứa giá trị băm Block liền trước preHash (preHash khởi tạo 32 bytes 0), H hàm băm SHA-256 -Yêu cầu đầu ra: thông tin Block chứa giá trị băm Block liền trước preHash giá trị ngẫu nhiên nonce thỏa mã điều kiện: w-bits H(H(preHash||nonce)) w-bits (w = 64) 2.2 Mã nguồn chƣơng trình using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Security.Cryptography; namespace Hashcash { public class Block { public static Byte[] preHash = new Byte[32]; // giá trị băm Block liền trước public static int nonce; // giá trị ngẫu nhiên thỏa mãn } class Program { // hàm kiểm tra điều kiện giá trị nonce private static bool checkCondition(Block block) { SHA256 hashValue = SHA256Managed.Create(); // khai báo giá trị băm string s; s = Block.nonce.ToString("X"); // chuyển đổi nonce sang hệ 16 byte[] b = new byte[s.Length * sizeof(char)+32]; byte[] buff = new byte[32]; System.Buffer.BlockCopy(Block.preHash, 0, b, 0, 32); System.Buffer.BlockCopy(s.ToCharArray(), 0, b, 32, s.Length); // băm hai lần buff = hashValue.ComputeHash(b); buff = hashValue.ComputeHash(buff); // kiểm tra điều kiện cho kết băm for (int i = 0; i < 8; i++ ) // kiểm tra 64 bit kết băm if (buff[i] != 0) return false; return true; } // hàm in thông tin Block tìm private static void printResult(Block block) { Console.Write("Previous Hash: "); 60 for (int i = 0; i < 32; i++) Console.Write(String.Format("{0:X2}", Block.preHash[i])); Console.WriteLine(); Console.Write("Nonce: " + Block.nonce); Console.WriteLine(); Console.WriteLine(); } static void Main(string[] args) { // Khởi tạo Block Block block = new Block(); Block.preHash = new Byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //32 byte Block.nonce = 0; while (true) { // Tăng giá trị ngẫu nhiên chưa thỏa mãn if (checkCondition(block) == false) Block.nonce++; // In Block tìm giá trị ngẫu nhiên thỏa mãn if (checkCondition(block) == true) { // In thông tin Block printResult(block); // Khởi tạo Block s = Block.nonce.ToString("X"); b = new byte[s.Length * sizeof(char) + 32]; System.Buffer.BlockCopy(Block.preHash, 0, b, 0, 32); System.Buffer.BlockCopy(s.ToCharArray(), 0, b, 32, s.Length); Block.preHash = hashValue.ComputeHash(b); //Console.Clear(); Block.preHash = hashValue.ComputeHash(Block.preHash); Block.nonce = 0; } } } } } 61 Chƣơng trình tính tốn xác suất mà cơng bắt kịp chuỗi hợp lệ từ khoảng cách z đƣợc viết ngôn ngữ C #include #include #include double AttackerSuccessProbability(double q, int z) { double p = 1.0 - q; double lambda = z * (q / p); double sum = 1.0; int i, k; for (k = 0; k