个人技术成长博客(1)
前情提要:个人技术成长博客主要是为了记录自己每日学习的内容,方便自己以后复习,比较简陋且内容较杂,同时难免有错误,恳请观者不吝赐教,感谢!
#今日学习内容
1.python中字符串前加b是什么意思?
2.SHA-256算法,hashlib包实现简单挖矿算法
3.椭圆曲线数字签名算法 ecdsa的原理
一. 学习内容
1.python中b加字符串是什么意思? // Python 字符串前面加b,u,r的含义
解答:python 3.x版本中默认的字符串是(py2.x里的)unicode, bytes是(py2.x)的str, b 前缀代表的就是bytes。
参考博客:[https://blog.csdn.net/cheng__lu/article/details/107725961]
2.什么是SHA-256算法,怎么通过python的hashlib包模拟实现SHA-256的挖矿算法
参考博客:
1.https://blog.csdn.net/weixin_43790276/article/details/98397456
2.SHA256算法原理及其实现
3.https://zhuanlan.zhihu.com/p/94619052
举例实验如下
实验题目:
比特币的“挖矿”过程实质是Hash值的逆向计算过程,即需要计算某个字符串m使得其Hash值以若干个0开头。
具体以多少个0加粗样式开头不确定,规定0的数量越多,计算出的难度就越大。请使用SHA-256算法,编写一个挖矿函数,用于计算字符串,其Hash值具有特定长度的0前缀。
函数定义:Miner(n) => m
n:0前缀长度
m:字符串,其Hash值以n个0开头
注:m不唯一,只需找到一个符合条件的即可。Python可以使用hashlib。
注意:Hash算法是不可逆的,只能从前往后暴力求解(目前博主本人所学的理解),所以在本机上测代码测试中,0的个数应该取值较小。
python实现代码如下:
import hashlib
import random
def miner(n):
random_str = ''
str1 = ''
count = 0
flag = 1
num = 0
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz,.0123456789'
length = len(base_str) - 1
while True:
for i in range(0,32):#32是自设的,阅读者可进行分析修改
random_str += base_str[random.randint(0,length)]
random_str = str(random_str)
#random_str.encode('utf-8')
h = hashlib.sha256(random_str.encode('utf-8'))
str1 = h.hexdigest()
for i in range(0,n):#计算从首位开始连续0的个数
if str1[i] == '0':
count = count + 1
else:
flag = 2
break
if count == n and flag == 1:
return random_str
if count > n:
count = 0
random_str = ''
str1 = ''
flag = 1
#查看迭代次数
num = num + 1
print(num)
n = int(input('请输入开头有多少个0:'))
str2 = miner(n)
h = hashlib.sha256(str2.encode('utf-8'))
print(h.hexdigest())
总结:在实验时运行多次出现编码错误,这和问题1的问题一样,在python3.x中,默认的是字符串为Unicode类型,而hash传递时需要的是utf-8类型,故应该先进行编码转换为正确的utf-8类型,才能实验成功。
参考博客:https://www.cnblogs.com/zqifa/p/python-hashlib-1.html
3.什么是椭圆曲线数字签名算法 ecdsa?
参考博客:ECDSA(椭圆曲线数字签名算法)
二. 学习总结
总结:这是第一篇学习记录,写的非常不成熟,今日为了完成密码学的实验作业,很浅显粗略的了解了一下相关知识,鄙人技术非常不成熟,未来还需要加强练习!