密码学:基于python支持448位输入的sha-1算法
来源:互联网 发布:windows store下载 编辑:程序博客网 时间:2024/06/06 03:50
#只支持448比特
#寄存器的初始值
H0 = 0x67452301
H1 = 0xefcdab89
H2 = 0x98badcfe
H3 = 0x10325476
H4 = 0xc3d2e1f0
H0 = 0x67452301
H1 = 0xefcdab89
H2 = 0x98badcfe
H3 = 0x10325476
H4 = 0xc3d2e1f0
#分组的所有字
W=[]
W=[]
#常数值Kt
def K(t):
if 0 <= t and t<=19:
return 0x5a827999
elif 20 <= t and t<=39:
return 0x6ed9eba1
elif 40 <= t and t<=59:
return 0x8f1bbcdc
elif 60 <= t and t<=79:
return 0xca62c1d6
#f基本逻辑函数
def F(t,b,c,d):
if 0 <= t and t<=19:
return (b&c) | (~b&d)
elif 20 <= t and t<=39:
return b^c^d
elif 40 <= t and t<=59:
return (b&c) | (b&d) | (c&d)
elif 60 <= t and t<=79:
return b^c^d
def K(t):
if 0 <= t and t<=19:
return 0x5a827999
elif 20 <= t and t<=39:
return 0x6ed9eba1
elif 40 <= t and t<=59:
return 0x8f1bbcdc
elif 60 <= t and t<=79:
return 0xca62c1d6
#f基本逻辑函数
def F(t,b,c,d):
if 0 <= t and t<=19:
return (b&c) | (~b&d)
elif 20 <= t and t<=39:
return b^c^d
elif 40 <= t and t<=59:
return (b&c) | (b&d) | (c&d)
elif 60 <= t and t<=79:
return b^c^d
#比特字Wt的值
def Wt(t):
a = W[t-16]^W[t-14]^W[t-8]^W[t-3]
W[t] = S(1,a)
return W[t]
#循环左移k
def S(k,a):
return ((a>>32-k) | (a<<k) & Sum())
#求32位1
def Sum():
s = 0;
for i in range(32):
s = s + 2**i
return s
#分割M
def dM(m):
for i in range(16):
W[i] = (m>>32*(15-i)) & Sum()
def dM(m):
for i in range(16):
W[i] = (m>>32*(15-i)) & Sum()
if __name__ == "__main__":
A = H0
B = H1
C = H2
D = H3
E = H4
A = H0
B = H1
C = H2
D = H3
E = H4
i=0
m = 0
M = input()
L = 8*len(M)
for ch in M:
m = m*(2**8)+ord(ch)
m = 0
M = input()
L = 8*len(M)
for ch in M:
m = m*(2**8)+ord(ch)
if L < 448:
m = m*2+1
#添加填充位
m = m*2**(447 - L)
#添加长度
m = m*2**64 + L
m = m*2+1
#添加填充位
m = m*2**(447 - L)
#添加长度
m = m*2**64 + L
for i in range(80):
W.append(i)
W.append(i)
dM(m)
for i in range(16,80):
Wt(i)
for i in range(16,80):
Wt(i)
print(hex(m))
#80步循环的寄存器
for t in range(80):
temp = (S(5,A)%(2**32)+W[t]%(2**32)+E+F(t,B,C,D)+K(t)%(2**32))%2**32
E = D
D = C
C = S(30,B)
B = A
A = temp
print(t,': ',hex(A),' ',hex(B)," ",hex(C)," ",hex(D)," ",hex(E))
for t in range(80):
temp = (S(5,A)%(2**32)+W[t]%(2**32)+E+F(t,B,C,D)+K(t)%(2**32))%2**32
E = D
D = C
C = S(30,B)
B = A
A = temp
print(t,': ',hex(A),' ',hex(B)," ",hex(C)," ",hex(D)," ",hex(E))
A = (A + H0)%2**32
B = (B + H1)%2**32
C = (C + H2)%2**32
D = (D + H3)%2**32
E = (E + H4)%2**32
B = (B + H1)%2**32
C = (C + H2)%2**32
D = (D + H3)%2**32
E = (E + H4)%2**32
isha = A*2**(4*32) + B*2**(3*32) + C*2**(2*32) + D*2**32 + E
sha = hex(isha)
print("消息摘要:",str(sha)[2:])
阅读全文
0 0
- 密码学:基于python支持448位输入的sha-1算法
- 密码学:基于python的rsa算法
- MD5和SHA-1算法输入的最大长度
- jasypt的使用和获取jdk支持的密码学算法
- 浏览器停止支持SHA-1算法,我国用户如何应对?
- 关于java散列算法(MD5 SHA-1 SHA-128 SHA-256..)的一点总结
- SHA-1算法的Java实现
- SHA 算法的使用
- SHA-1算法使用
- Sha-1算法详解
- SHA-1算法
- Sha-1算法详解
- 密码学大事件! SHA-1 哈希碰撞实例
- 【密码学】SHA-1加密原理及其Java实现
- 【密码学】C语言实现SHA-1填充和数据扩充
- 密码学原理_Crypto++实现SHA-1近似碰撞寻找
- 【数字摘要算法】SHA算法(sha-0/sha-1/sha-2)
- 为什么现代密码学中的安全是基于密钥的保密性的,而不是古典密码学的算法的保密性?
- http状态码表
- Java——使用DOM4j解析XML文档
- 2017 CCPC 哈尔滨
- leetcode: 32. Longest Valid Parentheses
- 4个小代
- 密码学:基于python支持448位输入的sha-1算法
- Angular2 ng-boostarp 日历控件
- 为什么修改jsp不用重启tomcat,而修改servlet要重启tomcat
- jar命名打包war
- 17.11.11,web学习第一天,还有一年,努力吧青年
- windows中docker打包使用
- MyEclipse字体及颜色的设置
- Struts2拦截器
- Android6.0没有权限读取外部存储的问题