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的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
浅谈Python的垃圾回收机制
Dec 17 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
keras:model.compile损失函数的用法
Jul 01 Python
python中的unittest框架实例详解
Feb 05 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与MySQL开发的8个技巧小结
2010/12/17 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
Vue实现手机计算器
2020/08/17 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
Python3分析处理声音数据的例子
2019/08/27 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
python 19个值得学习的编程技巧
2020/08/15 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
入学生会自荐书范文
2014/02/05 职场文书
学习退步检讨书
2014/09/28 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
党员承诺书格式范文
2015/04/28 职场文书
安全教育培训心得体会
2016/01/15 职场文书
靠谱的活动总结
2019/04/16 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电