# -*-coding:utf-8-*-"""
File Name: SHA-1算法.py
Program IDE: PyCharm
Create Time: 2021-09-18 20:15
Create By Author: 陆依依
"""import hashlib # 为了调库检验# 字符串转为2进制defEncode(string):return''.join([(8-len(bin(ord(s)).replace('0b','')))*'0'+bin(ord(s)).replace('0b','')for s in string])# 填充消息defPadding(message):# 将字节转为字符
message =''.join([chr(message[i])for i inrange(len(message))])
l =len(message)*8%512if l +1>448:
k =512-(l +1-448)else:
k =448- l -1
a =bin(len(message)*8).replace('0b','')
b ='0'*(64-len(a))+ a
c =''for i inrange(0,64,8):# 后64bit
c = c +chr(int(b[i: i+8],2))
message = message +chr(128)+chr(0)*int(k /8)+ c
return message
# 逻辑函数defF(t, B, C, D):if t <=19:return(B & C)|(~B & D)elif t <=39:return B ^ C ^ D
elif t <=59:return(B & C)|(B & D)|(C & D)else:return B ^ C ^ D
# 将数字num循环左移t位defROTL(t, num):
temp =(32-len(bin(num).replace('0b','')))*'0'+bin(num).replace('0b','')returnint(temp[t:]+ temp[:t],2)# 加密defEncrypt(message):
message = Padding(message)# 初始化变量
H0 =int('67452301',16)
H1 =int('EFCDAB89',16)
H2 =int('98BADCFE',16)
H3 =int('10325476',16)
H4 =int('C3D2E1F0',16)# 常量
K =[int('5A827999',16),int('6ED9EBA1',16),int('8F1BBCDC',16),int('CA62C1D6',16)]# 分块处理for i inrange(0,len(message),64):
temp = Encode(message[i:i +64])
W =[int(temp[j:j +32],2)for j inrange(0,512,32)]for j inrange(16,80):
W.append(ROTL(1,(W[j -3]^ W[j -8]^ W[j -14]^ W[j -16])))
A = H0
B = H1
C = H2
D = H3
E = H4
for j inrange(0,80):
T =(ROTL(5, A)+ F(j, B, C, D)+ E + W[j]+ K[int(j /20)])%(2**32)
E = D
D = C
C = ROTL(30, B)
B = A
A = T
H0 =(A + H0)%(2**32)
H1 =(B + H1)%(2**32)
H2 =(C + H2)%(2**32)
H3 =(D + H3)%(2**32)
H4 =(E + H4)%(2**32)returnstr((8-len(str(hex(H0)).replace('0x','')))*'0'+str(hex(H0)).replace('0x','')+(8-len(str(hex(H1)).replace('0x','')))*'0'+str(hex(H1)).replace('0x','')+(8-len(str(hex(H2)).replace('0x','')))*'0'+str(hex(H2)).replace('0x','')+(8-len(str(hex(H3)).replace('0x','')))*'0'+str(hex(H3)).replace('0x','')+(8-len(str(hex(H4)).replace('0x','')))*'0'+str(hex(H4)).replace('0x',''))# demoif __name__ =="__main__":while(True):
path =''# 默认文件路径
choose =int(input('请选择加密对象:1)文件 2)非文件\t'))if choose ==2:
message =input('请输入待加密内容:').encode('utf-8')else:
path =input('请输入完整文件路径:')
message =open(path,'rb').readlines()
temp = message[0]for i inrange(1,len(message)):
temp = temp + message[i]
message = temp
print('手动实现:'+ Encrypt(message))print('调库检验:'+ hashlib.sha1(message).hexdigest())print('hash是否相等?\t'+str(hashlib.sha1(message).hexdigest()== Encrypt(message)))