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 模板引擎的注入问题分析
Jan 01 Python
python django 实现验证码的功能实例代码
May 18 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
python tkinter图形界面代码统计工具
Sep 18 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
python图形用户接口实例详解
Dec 16 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
python numpy实现rolling滚动案例
Jun 08 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
python 带时区的日期格式化操作
Oct 23 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
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
jQuery实现模拟flash头像裁切上传功能示例
2016/12/11 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
Jquery-data的三种用法
2017/04/18 jQuery
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
详解python中的线程
2018/02/10 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
python list元素为tuple时的排序方法
2018/04/18 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
工商学院毕业生自荐信
2013/11/12 职场文书
三方合作协议书范本
2014/04/18 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
酒店温馨提示语
2015/07/14 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python