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 相关文章推荐
Python程序设计入门(1)基本语法简介
Jun 13 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
python 表格打印代码实例解析
Oct 12 Python
WxPython实现无边框界面
Nov 18 Python
python队列原理及实现方法示例
Nov 27 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 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 使用curl提交json格式数据
2013/06/29 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP实现八皇后算法
2019/05/06 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python解析json代码实例解析
2019/11/25 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
yy司仪主持词
2014/03/22 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
服务整改报告
2014/11/06 职场文书
银行员工考核评语
2014/12/31 职场文书
大学生学年个人总结
2015/02/15 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
无房证明样本
2015/06/17 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python