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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt Mac 在软件 icns图标制作

    Qt Mac 在软件 icns图标制作

    2022年1月7日
    276
  • 图像伽马校正_自适应伽马矫正matlab

    图像伽马校正_自适应伽马矫正matlabGamma矫正颜色空间(具体内容在之前的文章有讲)sRGB

    2022年9月24日
    3
  • MYSQL中TINYINT的取值范围

    原文地址:https://blog.csdn.net/lysygyy/article/details/5983433在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127。无符号的范围是0到255(见官方《MySQL5.1参考手册》http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#numeri…

    2022年4月5日
    49
  • DLL注入与安全

    DLL注入与安全伊始  安全与危险是共存的。如果我们了解危险的来源以及产生的过程,对于安全防护拥有很现实的意义。  本文主要介绍dll注入的方式,意在描述危险的来源,以及危险的执行的过程,以便于我们解决危险。主体这篇文章介绍2大类:序号方式1调用API2直接修改源码1.调用API  如果要实现注入,那么需要一个目标,一个DLL,一个注入程序。原理:  代码的执行…

    2022年5月16日
    49
  • Java重载和重写的区别「建议收藏」

    Java重载和重写的区别「建议收藏」1、方法的重载的概念在同一个类中,允许存在一个以上的同名方法,只要同名的参数个数或者参数类型不同即可。总结:”两同一不同”:同一个类、相同方法名参数列表不同:参数个数不同,参数类型不同2、例构成重载的举例:不能构成重载的举例:3、如何判断是否构成方法的重载?严格按照定义判断:两同一不同跟方法的权限修饰符、返回值类型、形参变量名、方法体都没关系!4、如何确定类中某一个方法的调用:方法名——>参数列表子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作重写以后,当创建子类对象以后,通过

    2022年9月9日
    2
  • python中怎么替换字符串中的内容_python怎么替换字符串的内容「建议收藏」

    python中怎么替换字符串中的内容_python怎么替换字符串的内容「建议收藏」Python中replace()函数把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。replace()函数语法:str.replace(old,new[,max])参数:old–将被替换的子字符串。new–新字符串,用于替换old子字符串。max–可选字符串,替换不超过max次。返回值:返回字符串中的o…

    2022年5月9日
    153

发表回复

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

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