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绘制人人网好友关系图示例
Apr 01 Python
python实现数通设备端口监控示例
Apr 02 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
Python中collections模块的基本使用教程
Dec 07 Python
python框架django项目部署相关知识详解
Nov 04 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
python实现程序重启和系统重启方式
Apr 16 Python
python接入支付宝的实例操作
Jul 20 Python
python正则表达式 匹配反斜杠的操作方法
Aug 07 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
python内置进制转换函数的操作
Jun 02 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
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
python 实现任务管理清单案例
2020/04/25 Python
python3 简单实现组合设计模式
2020/07/02 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
医院护士的求职信范文
2013/12/26 职场文书
工作会议欢迎词
2014/01/16 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
辩论会主持词
2015/07/03 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers