python移位运算,python移位运算

python移位运算,python移位运算title:python移位运算date:2018-10-1219:55:22tags:#标签-PYTHONpython移位运算密码算法程序设计实践选的SHA-1。在写的过程中遇到一丢丢关于python移位的问题,记录一下。SHA-1其中第一步需要填充消息。简单阐述一下sha1填充消息的过程:如输入消息“123”,先转成ascii码——313233,消息长度为3*8=24。即001100…

大家好,又见面了,我是你们的朋友全栈君。

title: python移位运算

date: 2018-10-12 19:55:22

tags: #标签

– PYTHON

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 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

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 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

填充消息结束。

数学真的太神奇了!!(摸了摸凉凉的头顶

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158515.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ntp时间服务器 时间同步

    具体两种模式1.服务器数量比较少,可以直接与公网时间服务器同步2.本地服务器较多,在本地设置时间同步服务器,  时间同步的两个命令ntpd :        校准时间,一点点的校准过来时间的,最终把时间慢慢的校正对。                     ntpd服务可以在修正时间的同时,修正cputick

    2022年4月9日
  • 基于大数据的舆情分析_舆情与大数据

    基于大数据的舆情分析_舆情与大数据数据工厂,是一套多组件化数据清洗加工及数据存储管理平台,同时能够管理所有的数据库的备份方案。支持多数据源类型的数据同步实现和数据仓库其他的数据源互通。对接收数据进行解压,对外提供压缩后的数据。

    2022年9月20日
  • linux修改密码永久有效[通俗易懂]

    linux修改密码永久有效[通俗易懂]password-X99999用户名称passwd用户名称

    2022年9月5日
  • 一些人人的代替[通俗易懂]

    一些人人的代替[通俗易懂]人人影视:http://www.yyets.com/  丫丫下载站:http://www.yayaxz.com/ 人人影视国际版:http://yzys.tv/   字幕大家也不用担心,推几个网站 http://subom.net/ 2.http://www.opensubtitles.org/   3.http://subsce…

    2022年7月15日
  • nonzero函数_python 类方法

    nonzero函数_python 类方法类的nonzero方法用于将类转换为布尔值。通常在用类进行判断和将类转换成布尔值时调用。比如语句ifA:print'foo'中就会调用A.nonzero()来判断。下面这个程序应

    2022年8月6日
  • int类型的长度是多少_强制转换成int类型

    int类型的长度是多少_强制转换成int类型Int16意思是16位整数(16bitinteger),相当于short占2个字节-32768~32767Int32意思是32位整数(32bitinteger),相当于int占4个字节-2147483648~2147483647Int64意思是64位整数(64bitinterger),相当于longlong占8个字节…

    2022年9月20日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号