时间:2021-05-22
密码算法程序设计实践选的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 00110011 10000000...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=128print(bin(n))n1=n*2**2+1#1000 0000 00+0000 0001 -->1000 0000 01print(bin(n1))n2=n<<2+1print(bin(n2))m=8#0000 1000print(bin(m))m1=m*2**2+1#0000 1000 00 +0001 00001000 01print(bin(m1))m2=m<<2+1print(bin(m2))输出结果:0b10000000
0b1000000001
0b10000000000
0b1000
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=00110001m再次左移8位,低位补0,此时m=00110001 00000000再加上二进制32,此时m=00110001 00110010m再次左移8位,此时m=00110001 00110010 00000000再加上二进制33,此时m=00110001 00110010 00110011遍历结束。补位过程:
如果L<448,即除了最后64bit消息长度,使得明文总长度为512bit。m先左移1位,低位补0m=00110001 00110010 00110011 0补位一个1,m=00110001 00110010 00110011 1添加填充位:m左移448-1-L长度的值,即447-L=423长度。m=00110001 00110010 00110011 1000000...00000000(1后有423个0)添加长度:m左移64bit,即00110001 00110010 00110011 10000000...0000000000000000 00000000 00000000 00000000 0000000000000000 00000000 00000000(1后有423+64个0,此时消息长度总共为24+423+1+64=512bit)m加上二进制L=24,即00011000。m=00110001 00110010 00110011 10000000...0000000000000000 00000000 00000000 00000000 0000000000000000 00000000 000011000填充消息结束。数学真的太神奇了!!(摸了摸凉凉的头顶
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
题目:如何在python中实现整数的二进制循环移位?概述在python中,可以通过运算符实现二进制的左移位以及右移位,然而并没有实现循环移位的运算符,暂时也找不
移位运算符它主要包括:左移位运算符(>)、带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。运算符含义>
右移运算符,移位运算符的一种:程序设计中,位操作运算符的一种。在c加加中,移位运算符有双目移位运算符:左移和右移。移位运算符组成的表达式也属于算术表达式,其值为
运算器的主要功能是实现算术运算和逻辑运算。运算器的基本功能是完成对各种数据的加工处理,例如算术四则运算,与、或、求反等逻辑运算,算术和逻辑移位操作,比较数值,变
java中有三种移位运算符:右移运算符,num>>1,相当于num除以2>>>:无符号右移,忽略符号位,空位都以0补齐下面来看看这些移位运算都是怎样使用的复制代