python移位运算的实现
密码算法程序设计实践选的SHA-1。
在写的过程中遇到⼀丢丢关于python移位的问题,记录⼀下。
SHA-1其中第⼀步需要填充消息。简单阐述⼀下sha1填充消息的过程:
如输⼊消息“123”,先转成ascii码——313233,消息长度为3*8=24。
即00110001 00110010 00110011
然后填充⼀个1占1bit,再填充447-24bit个0。
10000000 (00000000)
最后64bit加上消息长度24的⼆进制0001 1000
⼆进制相当于是:
00110001 00110010 00000000 00011000
16进制表⽰
31323380 00000000 (0018)
python部分代码块:
M = input()
# 1byte=8bit,L为M字符串长度
L = 8 * len(M)
m=0
for ch in M:#遍历字符串M
m = m * (2 ** 8) + ord(ch)
#  print(hex(m))#此时16进制的int类型m就是原始数据
#补位,使明⽂总长度为448(mod512)位
if L < 448:
m = m * 2 + 1 #补位
# 添加填充位
m = m * 2 ** (447 - L)
# 添加长度
m = m * 2 ** 64 + L
不只是python,对于移位运算都有:
左移:
运算规则:
按⼆进制形式把所有的数字向左移动对应位数,⾼位移出,低位补零。
在数字没有溢出的前提下,对于正数和负数,左移⼀位都相当于乘以2的1次⽅,左移n位就相当于乘以2的n次⽅。乘以2**n 相当于向左移动n位数,⾼位移出0,右边低位的空位补零。
n=128
print(bin(n))
n1=n*2**2+1#1000 0000 00+0000 0001 -->1000 0000 01
print(bin(n1))
n2=n<<2+1
print(bin(n2))
m=8#0000 1000
print(bin(m))
m1=m*2**2+1#0000 1000 00 +0001 00001000 01
print(bin(m1))
m2=m<<2+1
print(bin(m2))
输出结果:0b10000000
0b1000000001
0b10000000000
字符串长度 python0b1000
0b100001
0b1000000
Process finished with exit code 0
同理,右移可以⽤>>或者除以2**n,相当于取商,不要余数。不过有符号区别。
但同时注意运算符优先级的问题,
python中,优先级从⾼到低分别是:
**,~+-(按位翻转如~1,-1),* / % //,+-(普通加减法),<< >>....
虽然乘以2**n和<<;效果⼀样,但是在运算中可能因为运算优先级的问题导致运算结果不同。之前sha1填充消息代码过程整理⼀下如下:
遍历过程:
L=24,m初值=为0
然后m左移8位,此时m不变仍然是00000000
再加上⼆进制31,此时m=00110001
m再次左移8位,低位补0,此时m=00110001 00000000
再加上⼆进制32,此时m=00110001 00110010
m再次左移8位,此时m=00110001 00110010 00000000
再加上⼆进制33,此时m=00110001 00110010 00110011
遍历结束。
补位过程:
如果L<448,即除了最后64bit消息长度,使得明⽂总长度为512bit。
m先左移1位,低位补0
m=00110001 00110010 00110011 0
补位⼀个1,m=00110001 00110010 00110011 1
添加填充位:m左移448-1-L长度的值,即447-L=423长度。
m=00110001 00110010 00000000(1后有423个0)
添加长度:m左移64bit,即
00110001 00110010 00110011 10000000 (00000000)
00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
(1后有423+64个0,此时消息长度总共为24+423+1+64=512bit)
m加上⼆进制L=24,即00011000。
m=00110001 00110010 00110011 10000000 (00000000)
00000000 00000000 00000000 00000000 00000000
00000000 00000000 000011000
填充消息结束。
数学真的太神奇了!!(摸了摸凉凉的头顶
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

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