报文摘要算法

更新时间:2023-07-19 05:45:17 阅读: 评论:0

报⽂摘要算法
1 报⽂摘要算法
报⽂摘要算法是⼀种将任意长度报⽂转换成固定长度的报⽂摘要算法。它具有以下六个特点:能够作⽤于任意长度的报⽂;产⽣有限位数的标识信息;易于实现;具有单向性;具有抗碰撞性;具有⾼灵敏性。
1.1 MD5
1.1.1 添加填充位
将报⽂X添加⾸位为1,其余为0的填充位,填充位长度为Y,使得X与Y的和模512为448。最后加上表⽰报⽂长度的64位⼆进制数,共同组成数据序列。
1.1.2 分组操作
将数据序列分割成512位的数据段,对每⼀段数据段单独进⾏报⽂摘要运算,每⼀段数据段的输⼊是512的数据段和前⼀段进⾏报⽂摘要运算后的128位结果。
1.1.3 MD5运算过程
每⼀段的512位数据段,它包含4级运算,每⼀级运算过程进⾏16次迭代运算。512位数据段被分成16个32位的字,16次迭代运算,输出为32位。4级运算⼀共产⽣4*32位=128位结果。
初始运算有⼀个128位的初始向量,第⼀个数据段的运算过程的输⼊是初始向量和第⼀个数据段,其后数据段的运算过程的输⼊是512位的数据段和上⼀段运算的结果。
1.2 SHA-1
与MD5有相同的填充过程与分组操作。不同的是初始向量与每⼀段的运算结果是5个32位的字;所以每⼀级进⾏20次迭代运算,4级共80次运算。需要将16个32位数据段扩展为80个32位字并分别参加80次迭代运算,但每⼀级操作使⽤同⼀个常量,故常数只需4个。
⼆者⽐较来看,SHA-1的摘要长度是160位,MD5的摘要长度是128位,SHA-1的抗碰撞性更好,同时也使得其计算复杂性⾼。
1.3 消息鉴别码(Hashed Message Authentication)
对消息的报⽂摘要进⾏加密运算后得到的结果,⽤于实现消息完整性检测的附加信息。
密钥K需要扩充到与数据段长度b相同,变为密钥K+。然后K+与某字节1异或得到S1,K+与某字节2异或得到S0,将S1与报⽂P串接后进⾏报⽂摘要运算,并将运算后的结果扩展为b位并与S0串接,再进⾏报⽂摘要运算,最后得到的结果就是HMAC。
1.4 报⽂摘要应⽤
1.4.1 完整性检测
阴脉之海
应⽤密钥对报⽂进⾏加密并⽣成附加信息,将附加信息与报⽂⼀起发送,接收端可以使⽤相同密钥进⾏解密以验证报⽂在运输过程中是否被修改。
1.4.2 消息鉴别
消息鉴别是验证消息M确实是X发送的过程。
1.4.3 ⼝令安全存储
算法的单向性使得在知道报⽂摘要h的情况下,⽆法找到报⽂P使得h=MD§。
思政
1.4.4 数字签名
数字签名是某个报⽂的附加信息,该附加消息能够证明签名者的真实性,也能证明签名者是对该报⽂的确认。
2 报⽂摘要算法代码(MD5)
# -*- coding: utf-8 -*-
import struct
import math
import binascii
lrot =lambda x,n:(x << n)|(x >>32- n)#循环左移的骚操作
#初始向量
A, B, C, D =(0x67452301,0xefcdab89,0x98badcfe,0x10325476)
# A, B, C, D = (0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210)
#循环左移的位移位数
r =[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21
]
#使⽤正弦函数产⽣的位随机数,也就是书本上的T[i]
T =[int(math.floor(abs(math.sin(i +1))*(2**32)))for i in range(64)]
def init_mess(message):
global A
生活超市global B
global C
global D
A, B, C, D =(0x67452301,0xefcdab89,0x98badcfe,0x10325476)
# A, B, C, D = (0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210)
吃什么补充雌激素#将python值转为字节流      Q--Standard size=8
length = struct.pack('<Q',len(message)*8)#原消息长度64位⽐特的添加格式,bytes类型
while len(message)>64:
solve(message[:64])
message = message[64:]
#长度不⾜64位消息⾃⾏填充
#因为python3对字符串和⼆进制数据流做了明确的区分,所以需要先将message的数据类型改为bytes
message=bytes(message,'utf-8')# type convert to bytes
message +=b'\x80'
message +=b'\x80'
message +=b'\x00'*(56-len(message)%64)#len=56
message += length  # len=64
#print(binascii.b2a_hex(message))
solve(message[:64])
def solve(chunk):
global A
global B
global C
global D
#将字节流转为python数据类型  I---Standard size=4  python type=integer
M =list(struct.unpack('<'+'I'*16, chunk))#分成16个组,I代表1组32位
李士群#print(M)
a, b, c, d = A, B, C, D
for i in range(64):#64轮运算
if i <16:#每⼀轮运算只⽤到了b,c,d三个
f =( b & c)|((~b)& d)
flag  = i      #⽤于标识处于第⼏组信息
elif i <32:
f =(b & d)|(c &(~d))
flag =(5* i +1)%16
elif i <48:
f =(b ^ c ^ d)
flag  =(3* i +5)%16
el:
f = c ^(b |(~d))
flag  =(7* i )%16
tmp = b + lrot((a + f + T[i]+ M[flag])&0xffffffff,r[i])#&0xffffffff为了类型转换
a, b, c, d = d, tmp &0xffffffff, b, c
#print(hex(a).replace("0x","").replace("L",""), hex(b).replace("0x","").replace("L","") , hex(c).replace("0x","").replace("L",""), hex(d).replace("0x","").repla ce("L",""))
A =(A + a)&0xffffffff
B =(B + b)&0xffffffff
C =(C + c)&0xffffffff
D =(D + d)&0xffffffff
人体模特艺术
def digest():#output长度为16*8=128
在家的工作
global A
global B
global C
global D
print(type(struct.pack('<IIII',A,B,C,D)))
手脚麻木是怎么回事
return struct.pack('<IIII',A,B,C,D)
def hex_digest():
#返回⼆进制表⽰的⼗六进制表⽰
# decode()⽅法以 encoding 指定的编码格式解码字符串,默认为字符串编码
return binascii.hexlify(digest()).decode()
if __name__ =='__main__':
while True:
mess =input("请输⼊你的信息:")
init_mess(mess)
out_put = hex_digest()
print(out_put)

本文发布于:2023-07-19 05:45:17,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1104485.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:运算   摘要   数据   消息   过程
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图