python移位运算的实现


Posted in Python onJuly 15, 2019

密码算法程序设计实践选的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

填充消息结束。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django REST为文件属性输出完整URL的方法
Dec 18 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Python实战之疫苗研发情况可视化
May 18 Python
python中subplot大小的设置步骤
Jun 28 Python
python与C、C++混编的四种方式(小结)
Jul 15 #Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 #Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 #Python
Python将文字转成语音并读出来的实例详解
Jul 15 #Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 #Python
Python符号计算之实现函数极限的方法
Jul 15 #Python
在python 中split()使用多符号分割的例子
Jul 15 #Python
You might like
php下通过POST还是GET来传值
2008/06/05 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
php实现插入排序
2015/03/29 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
python3使用GUI统计代码量
2019/09/18 Python
python元组拆包实现方法
2021/02/28 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
社区工作者思想汇报
2014/01/13 职场文书
加拿大留学自荐信
2014/01/28 职场文书
售后服务承诺书范文
2014/03/26 职场文书
《赶海》教学反思
2014/04/20 职场文书
社团活动总结范文
2014/04/26 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
保研推荐信格式
2015/03/25 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技