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变量作用范围实例分析
Jul 07 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
python3爬取淘宝信息代码分析
Feb 10 Python
Python之用户输入的实例
Jun 22 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
django框架forms组件用法实例详解
Dec 10 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
利用python清除移动硬盘中的临时文件
Oct 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
表单复选框向PHP传输数据的代码
2007/11/13 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
解析PHP的session过期设置
2013/06/29 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
Javascript Math对象
2009/08/13 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
Python3基础之基本运算符概述
2014/08/13 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python3实现弹弹球小游戏
2019/11/25 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Django视图类型总结
2021/02/17 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
高中生自我评价个人范文
2013/11/09 职场文书
开服装店计划书
2014/08/15 职场文书
2014年就业工作总结
2014/11/26 职场文书
舞出我人生观后感
2015/06/16 职场文书