密码算法程序设计实践选的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=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
0b1000
0b100001
0b1000000Process 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 00110011 1000000...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 填充消息结束。
数学真的太神奇了!!(摸了摸凉凉的头顶
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符
主要内容:& 按位与运算符,| 按位或运算符,^按位异或运算符,~按位取反运算符,<<左移运算符,>>右移运算符Python 位运算按照数据在内存中的二进制位(Bit)进行操作,它一般用于底层开发(算法设计、驱动、图像处理、单片机等),在应用层开发(Web 开发、Linux 运维等)中并不常见。想加快学习进度,或者不关注底层开发的读者可以先跳过本节,以后需要的话再来学习。 Python 位运算符只能用来操作整数类型,它按照整数在内存中的二进制形式进行计算。Python 支持的位运算符如表 1 所
问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。
我已经用python编写了medians算法的median的实现,但是它似乎没有输出正确的结果,而且对我来说它似乎也没有线性复杂度,知道我哪里出错了吗? 这个函数是这样调用的: 乐:不好意思。GetMed是一个简单地对列表排序并返回len(list)处的元素的函数,它应该在那里被选择,我现在修复了它,但我仍然得到错误的输出。至于缩进,代码工作没有错误,我看不出有什么问题:-?? LE2:我期望50
问题内容: 我对何时应该使用布尔运算符与按位运算符感到困惑 与 与 有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果? 问题答案: 以下是一些准则: 布尔运算符通常用于布尔值,而按位运算符通常用于整数值。 布尔运算符是短路,但按位运算符不是短路。 短路行为在这样的表达式中很有用: 按位运算&符将无法正常工作,因为总是会评估双方,即。当你使用布尔运算符时,如果第一个为False,则不计算
假设: 2的补码形式的32位有符号整数 true和false是值为1和0的整数 java运算符 你能实现像<代码>