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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
详谈Python基础之内置函数和递归
Jun 21 Python
如何利用python查找电脑文件
Apr 27 Python
详谈python在windows中的文件路径问题
Apr 28 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python装饰器原理与用法深入详解
Dec 19 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Django mysqlclient安装和使用详解
Sep 17 Python
python全栈开发语法总结
Nov 22 Python
python-地图可视化组件folium的操作
Dec 14 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 file_get_contents取文件中数组元素的方法
2017/04/01 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Django中使用group_by的方法
2015/05/26 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python设计模式大全
2016/06/27 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
存储过程的优点有哪些
2012/09/27 面试题
收银员岗位职责
2014/02/07 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
借款协议书
2014/09/16 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL