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实现学校管理系统
Jan 11 Python
对python中执行DOS命令的3种方法总结
May 12 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
python内存动态分配过程详解
Jul 15 Python
python修改FTP服务器上的文件名
Sep 11 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python实现滑雪小游戏
Sep 25 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 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
详解PHP处理密码的几种方式
2016/11/30 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
python交易记录链的实现过程详解
2019/07/03 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
经营理念口号
2014/06/21 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
红色电影观后感
2015/06/18 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL