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实现颜色rgb和hex相互转换的函数
Mar 19 Python
Python中关于使用模块的基础知识
May 24 Python
星球大战与Python之间的那些事
Jan 07 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
Python 备份程序代码实现
Mar 06 Python
深入理解Python中的内置常量
May 20 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
python 字典套字典或列表的示例
Dec 16 Python
详细分析Python collections工具库
Jul 16 Python
python opencv角点检测连线功能的实现代码
Nov 24 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
用PHP开发GUI
2006/10/09 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
一个javascript参数的小问题
2008/03/02 Javascript
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
python实现kNN算法
2017/12/20 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
python中加背景音乐如何操作
2020/07/19 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
保护环境倡议书
2014/04/14 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
2014年司法所工作总结
2014/11/22 职场文书
张丽莉观后感
2015/06/16 职场文书
详解python的内存分配机制
2021/05/10 Python
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS