MD5/AES/RSA算法简介

前言:

工作中常用模块,我们所说的加密方式,都是对二进制编码的格式进行加密的,就是人们常说的Bytes数据,所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。

作者:Simon0903

链接:https://www.jianshu.com/u/2b4bc3b5e6fc

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。



ASE及RSA加密算法需要用到加密库PyCryptodome

转bytes数据加密概念以及encode() & decode()方法简述

# encode()方法中不传参数则是以默认的utf-8编码进行转换

% name = 'str'.encode()

% print(name)


# decode() 

% byte_name = b'\xx\xx\xx\xx\xx\xx'.decode()

% print(byte_name)


**注:两位十六进制常常用来显示一个二进制字节。**

用binascii.b2a_hex()方法去掉斜杠(/)后再显示的bytes数据

% N = binascii.b2a_hex('str'.encod())

% print(N)


% B = binascii.a2b_hex(b'eq53ewqw45ew'.encode()) 

% print(B.decode())




MD5(信息-摘要算法)

 #由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作


message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。

md5,其实就是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

不可逆性(无法复原,一般应用在用户密码加密上)

每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。

特点

压缩性:任意长度的数据,算出的MD5值长度都是固定的 

容易计算:从原数据计算出MD5值很容易。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的

% import hashlib  #导入包

% h = hashlib.md5()  # 创建md5实例对象

% h.update('str'.encode())   # 传参必须加入encode()方法转bytes数据

% print(h.hexdigest())   #提取MD5数据查看






Python加密库PyCryptodome

PyCrypto是 Python 中密码学方面最有名的第三方软件包。可惜的是,它的开发工作于2012年就已停止。

幸运的是,有一个该项目的分支PyCrytodome 取代了 PyCrypto 。

Windows安装之前需要先安装Microsoft Visual c++ 2015

下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=48145

Linux上安装,可以使用以下 pip 命令:

% pip install pycryptodome

导入

import Crypto


Windows 系统上安装则稍有不同:

% pip install pycryptodomex

导入

import Cryptodome


AES对称加密:

简介:

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES在软件及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的存储器。作为一个新的加密标准,目前正被部署应用到更广大的范围。


特点与思想

抵抗所有已知的攻击。

在多个平台上速度快,编码紧凑。

设计简单。

原理:



AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。

加密;(常用是128位)

% from Cryptodome.Cipher import AES

% from Cryptodome import Random

% from binascii import b2a_hex 


% data = '四海为家'    #要加密的数据 

% key = b'abcdefghigklmnop'    # 密钥key 长度必须为16(AES-128) 、24(AES-192)、或32(AES-256)Bytes 长度.

% iv = Random.new().read(AES.block_size)  #的密钥向量 , 随机生成长度等于AES块大小且不可重复的一组数据


% myencrypt_module =  AES.new(key, AES.MODE_CFB, iv)   # 初始化AES对象, 要加入 "key",  "AES.MODE_CFB"  和 " iv "  这3个元素


% content = iv + myencrypt_module .encrypt(data.encode())  # 数据加密  (前16位的iv随机的无意义字符) 

% print('加密以后:{}'.format(content))


解密:

#需另外生成一个AES实例:

% myencrypt002 = AES.new(key, AES.MODE_CFB,content[:16])    #最后一个参数是iv, 之前加密过,下标取值前16字节

% mydecrypt = myencrypt002.decrypt(content[16:])  # 解密16字节之后的密文

$ print('解密以后:{}'.format(mydecrypt.decode()))





RSA非对称加密:

典型的如RSA等,常见方法,使用openssl ,keytools等工具生成一对公私钥对,使用被公钥加密的数据可以使用私钥来解密,反之亦然(被私钥加密的数据也可以被公钥解密) 。

实际使用中私钥一般保存在发布者手中不对外传递且不公开的只将公钥对外公布和传递,就能实现只有私钥的持有者才能将数据解密的方法。这种加密方式安全系数很高,因为它不用将解密的密钥进行传递,从而没有密钥在传递过程中被截获的风险,而破解密文几乎又是不可能的。    

这个算法的效率低,所以常用于很重要数据的加密,常和对称配合使用,使用非对称加密的密钥去加密对称加密的密钥。

原理:

两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,

而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

需要一个包来支持,window和linux 安装命令如下

% pip install rsa

RSA的公钥私钥都是10进制的,但公钥的值常常保存为16进制的格式,所以需要将其用int()方法转换为10进制格式。




生成RSA公钥私钥对;

% import RSA

% pubkey = rsa.newkey(1024)   #加密的长度

% print(pubkey)  #输出 publickey公钥(短),privatekey私钥(长) 


1、解析网页,截获得的rsa_n ,rsa_e 值配成公钥

2、利用公钥把明文加密发回

(部分网站在登录页面填写form表单的时候会RSA加密,同时我们也需要把数据加密成RSA提交,而N,E值需要在解析网页的时候找到)

举例:N值和E值生成  publickey公钥N 进行数据加密

 # 如果写成函数,则建议加上isinstance(data, str)判断一下N值类型避免报错

import RSA

import binascii


% data = '加勒比海盗'

% n = '256字节长度的字符'    原文是一长串字符,Linux复制的信息转不出window粘贴

% e = '65537'  # 

% key_n = int(n,16)    #把16进制转10进制,前文说过

% key_e = int(e,16)    #把16进制转10进制,前文说过


% mypubkey = rsa.Publickey(key_n, key_e )    #根据N和E生成一个公钥 

% b_data = hex.b2a(data)  #返回就是bytes数据

% content = rsa.encrypt(b_data ,mypubkey )   #加密完成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容