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写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
Django实现分页功能
Jul 02 Python
python如何生成各种随机分布图
Aug 27 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
python写一个随机点名软件的实例
Nov 28 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
python实现取余操作的简单实例
Aug 16 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
Python实战之OpenCV实现猫脸检测
Jun 26 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使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
pycharm安装图文教程
2017/05/02 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
如何在Python对Excel进行读取
2020/06/04 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
大学毕业自我评价
2014/02/02 职场文书
岗位廉政承诺书
2014/03/27 职场文书
期中考试反思800字
2014/05/01 职场文书
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
java实现web实时消息推送的七种方案
2022/07/23 Java/Android
element tree树形组件回显数据问题解决
2022/08/14 Javascript