一、实验目的
了解区块链挖矿原理及过程。
二、实验器材
pycharm+python3.11
三、实验内容
实验要求:在前面已经配置好的实验环境和实验三编写的单向散列函数实现程序的基础给程序添加计时功能,进行下列实验:
(1)找一个文件M,将文件中的汉字和标点符号用区位码代替生成一个数字字符串,如果是英文的文件,将英文、标点符号和空格都用ASCII代替,转换的程序可以自己编写程序,也可以调用别人的程序。转换之后计算该文件的单向散列函数值H(M),然后通过在该散列函数值后面添加随机数的方法,即进一步计算H(H(M)||R)的方法进行挖矿。
转换程序:
1 def strQtoCode(s): 2 """将汉字转换为区位码""" 3 # 获取汉字的Unicode编码 4 unicode_code = ord(s) 5 # 根据Unicode编码计算区位码 6 zone_code = (unicode_code - 0x4E00) % 94 + 1 7 return zone_code 8 9 def strEtoCode(s): 10 return ord(s) 11 12 13 def convert_file_content(file_path): 14 with open(file_path, 'r', encoding='utf-8') as f: 15 content = f.read() 16 17 result = [] 18 for char in content: 19 if '\u4e00' <= char <= '\u9fa5': # 汉字 20 result.append(strQtoCode(char)) 21 elif '\u0020' <= char <= '\u007e': # 英文、标点、空格 22 result.append(strEtoCode(char)) 23 return ''.join(list(map(str,result))) 24 25 26 # 测试代码 27 if __name__ == "__main__": 28 file_path = input("请输入文件路径: ") 29 print(convert_file_content(file_path))
结果输出:
计算该文件单向散列函数值H(M)并添加随机数进行挖矿:
1 import struct 2 import random 3 4 def F(x, y, z): 5 return (x & y) | (~x & z) 6 7 8 def G(x, y, z): 9 return (x & y) | (x & z) | (y & z) 10 11 12 def H(x, y, z): 13 return x ^ y ^ z 14 15 16 def left_rotate(n, b): 17 return ((n << b) | (n >> (32 - b))) & 0xFFFFFFFF 18 19 20 def padding(message): 21 length = len(message) * 8 % 64 # Corrected this line 22 padding = b'\x80' + b'\x00' * ((56 - (length + 1) % 64) % 64) + struct.pack('<Q', length) 23 return message + padding 24 25 26 def md4(message): 27 message = padding(message) 28 num_blocks = len(message) // 64 # Calculate the number of blocks 29 30 A = 0x67452301 31 B = 0xEFCDAB89 32 C = 0x98BADCFE 33 D = 0x10325476 34 35 for i in range(num_blocks): 36 X = struct.unpack('<16I', message[i * 64:(i + 1) * 64]) # Process one block at a time 37 38 a = A 39 b = B 40 c = C 41 d = D 42 43 for j in range(16): 44 k = F(b, c, d) 45 temp = left_rotate(a + k + X[j], 3) 46 a = d 47 d = c 48 c = b 49 b = temp 50 51 for j in range(16): 52 k = G(b, c, d) 53 temp = left_rotate(a + k + X[(j * 5 + 1) % 16], 7) 54 a = d 55 d = c 56 c = b 57 b = temp 58 59 for j in range(16): 60 k = H(b, c, d) 61 temp = left_rotate(a + k + X[(j * 3 + 5) % 16], 11) 62 a = d 63 d = c 64 c = b 65 b = temp 66 67 A = (A + a) & 0xFFFFFFFF 68 B = (B + b) & 0xFFFFFFFF 69 C = (C + c) & 0xFFFFFFFF 70 D = (D + d) & 0xFFFFFFFF 71 72 digest = struct.pack('<4I', A, B, C, D) 73 return digest[::-1] # Return the digest in the correct order (LSB first) 74 75 76 message = b'104101108108111712833' 77 print('Message:', message) 78 result1 = md4(message).hex() 79 print('H(M):',result1) 80 81 # # 生成一个介于1和10000之间的随机整数 82 random_number = random.randint(1, 10000) 83 84 # 将原始结果和随机整数拼接在一起 85 result = result1 + str(random_number) 86 result = result.encode("utf-8") 87 print('Message:',result) 88 print('H(H(M)//R):', md4(result).hex())
结果输出:
(2)设置单向散列函数值为256比特,假设要求H(H(M)||R)< 2250,首先设置R=0,计算H(H(M)||R),首先将R值设置为0,然后每次将R值增加1计算对应的单向散列函数值,直到找到满足要求的单向散列函数值。记下对应的随机数、单向散列函数值和找到满足要求的函数值的时间。
程序:
1 import hashlib 2 import time 3 4 # 定义哈希函数的比特长度 5 hash_bits = 256 6 7 # 计算 H(H(M)||R) 8 def calculate_hash(data, R): 9 data_with_R = data + str(R) # 将R添加到数据后面 10 hashed_data_with_R = hashlib.sha256(data_with_R.encode()).hexdigest() # 计算 H(M)||R 11 final_hash = hashlib.sha256(hashed_data_with_R.encode()).hexdigest() # 计算 H(H(M)||R) 12 return final_hash 13 14 # 计算满足条件的 R 和对应的哈希值 15 def find_hash_value(data): 16 R = 0 17 while True: 18 hash_value = calculate_hash(data, R) 19 if int(hash_value, 16) < 2**250: # 将哈希值转换为整数并进行比较 20 return R, hash_value 21 R += 1 22 23 # 主程序 24 data = "了解区块链原理及挖矿过程" # 假设的输入数据 25 start_time = time.time() # 记录开始时间 26 R, hash_value = find_hash_value(data) # 寻找满足条件的 R 和对应的哈希值 27 end_time = time.time() # 记录结束时间 28 29 print(f"满足条件的 R 值:{R}") 30 print(f"对应的哈希值:{hash_value}") 31 print(f"找到满足要求的函数值的时间:{end_time - start_time} 秒")
结果输出:
(3)要求H(H(M)||R)< 2240,仍然利用(2)的方法寻找满足要求的单向散列函数值,直到找到。记下对应的随机数,单向散列函数值和找到满足要求的函数值的时间。
程序:
1 import hashlib 2 import time 3 4 # 定义哈希函数的比特长度 5 hash_bits = 256 6 7 # 计算 H(H(M)||R) 8 def calculate_hash(data, R): 9 data_with_R = data + str(R) # 将R添加到数据后面 10 hashed_data_with_R = hashlib.sha256(data_with_R.encode()).hexdigest() # 计算 H(M)||R 11 final_hash = hashlib.sha256(hashed_data_with_R.encode()).hexdigest() # 计算 H(H(M)||R) 12 return final_hash 13 14 # 计算满足条件的 R 和对应的哈希值 15 def find_hash_value(data): 16 R = 0 17 while True: 18 hash_value = calculate_hash(data, R) 19 if int(hash_value, 16) < 2**240: # 将哈希值转换为整数并进行比较 20 return R, hash_value 21 R += 1 22 23 # 主程序 24 data = "了解区块链原理及挖矿过程" # 假设的输入数据 25 start_time = time.time() # 记录开始时间 26 R, hash_value = find_hash_value(data) # 寻找满足条件的 R 和对应的哈希值 27 end_time = time.time() # 记录结束时间 28 29 print(f"满足条件的 R 值:{R}") 30 print(f"对应的哈希值:{hash_value}") 31 print(f"找到满足要求的函数值的时间:{end_time - start_time} 秒")
结果输出:
标签:hash,value,实验,time,return,区块,data,def,挖矿 From: https://www.cnblogs.com/doris510/p/17975310