广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Crypto算法库详解
  • 188
分享到

Crypto算法库详解

算法详解Crypto 2023-01-31 08:01:05 188人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

安装与使用 Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3,安装也很简单pip install pyc

安装与使用

Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3,安装也很简单pip install pycryptodome就行了!详细的用法可以看看 官方文档

常见对称密码在 Crypto.Cipher 库下,主要有:DES 3DES AES RC4 Salsa20
非对称密码在 Crypto.PublicKey 库下,主要有:RSA ECC DSA
哈希密码在 Crypto.Hash 库下,常用的有:MD5 SHA-1 SHA-128 SHA-256
随机数在 Crypto.Random 库下
实用小工具在 Crypto.Util 库下
数字签名在 Crypto.Signature 库下

对称密码AES

注意:Python3 和 python2 在字符串方面有个明显的区别 - python3 中有字节串 b'byte',python2 中没有字节。由于这个库是在 python3 下的,所以加解密用的都是字节!

使用这个库来加解密特别简单,记住这四步:

  • 导入所需库

from Crypto.Cipher import AES

  • 初始化 key

key = b'this_is_a_key'

  • 实例化加解密对象

aes = AES.new(key,AES.MODE_ECB)

  • 使用实例加解密

text_enc = aes.encrypt(b'helloworld')

from Crypto.Cipher import AES
import base64

key = bytes('this_is_a_key'.ljust(16,' '),encoding='utf8')
aes = AES.new(key,AES.MODE_ECB)

# encrypt
plain_text = bytes('this_is_a_plain'.ljust(16,' '),encoding='utf8')
text_enc = aes.encrypt(plain_text)
text_enc_b64 = base64.b64encode(text_enc)
print(text_enc_b64.decode(encoding='utf8'))

# decrypt
msg_enc = base64.b64decode(text_enc_b64)
msg = aes.decrypt(msg_enc)
print(msg.decode(encoding='utf8'))

注意:key和明文是需要填充到指定位数的,可以使用ljust或者zfill之类的填充,也可以用Util中的pad()函数填充!

对称密码DES

from Crypto.Cipher import DES
import base64

key = bytes('test_key'.ljust(8,' '),encoding='utf8')
des = DES.new(key,DES.MODE_ECB)

# encrypt
plain_text = bytes('this_is_a_plain'.ljust(16,' '),encoding='utf8')
text_enc = des.encrypt(plain_text)
text_enc_b64 = base64.b64encode(text_enc)
print(text_enc_b64.decode(encoding='utf8'))

# decrypt
msg_enc = base64.b64decode(text_enc_b64)
msg = des.decrypt(msg_enc)
print(msg.decode(encoding='utf8'))

非对称密码RSA

这个库的 RSA 主要是用来生成公钥文件/私钥文件或者读取公钥文件/私钥文件
生成公/私钥文件:

from Crypto.PublicKey import RSA

rsa = RSA.generate(2048) # 返回的是密钥对象

public_pem = rsa.publickey().exporTKEy('PEM') # 生成公钥字节流
private_pem = rsa.exportKey('PEM') # 生成私钥字节流

f = open('public.pem','wb')
f.write(public_pem) # 将字节流写入文件
f.close()
f = open('private.pem','wb')
f.write(private_pem) # 将字节流写入文件
f.close()
#
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArreg3IX19DbszqSdBKhR
9cm495XAk9PBQJwHiwjKv6S1Tk5h7xL9/fPZIITy1M1k8LwuoSJPac/zcK6rYgMb
DT9tmVLbi6CdWNl5agVue2WgsB/eifEcfnZ9KiT9xTrpmj5BJql9H+znseA1AzlP
iTukrH1frD3SzZIVnq/pBly3QbsT13UdUhbmIgeQto8wL9V0Sj+sMFOIZY+xHscK
IeDOv4/JIxw0q2TMTsE3HRgAX9CXvk6u9zJCH3EEzl0w9EQr8TT7ql3GJg2hJ9SD
biebjImLuUii7Nv20qLOpIJ8qR6O531kMQ1gykiSfqj6AHqxkufxTHklCsHj9B8F
8QIDAQAB
-----END PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArreg3IX19DbszqSdBKhR9cm495XAk9PBQJwHiwjKv6S1Tk5h
7xL9/fPZIITy1M1k8LwuoSJPac/zcK6rYgMbDT9tmVLbi6CdWNl5agvUE2WgsB/e
ifEcfnZ9KiT9xTrpmj5BJql9H+znseA1AzlPiTukrH1frD3SzZIVnq/pBly3QbsT
13UdUhbmIgeqTo8wL9V0Sj+sMFOIZY+xHscKIeDOv4/JIxw0q2TMTsE3HRgAX9CX
vk6u9zJCH3EEzl0w9EQr8TT7ql3GJg2hJ9SDbiebjImLuUii7Nv20qLOpIJ8qR6O
531kmQ1gykiSfqj6AHqxkufxTHklCsHj9B8F8QIDAQABAoI...
-----END RSA PRIVATE KEY-----

读取公/私钥文件加解密:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

def rsa_encrypt(plain):
    with open('public.pem','rb') as f:
        data = f.read()
        key = RSA.importKey(data)
        rsa = PKCS1_v1_5.new(key)
        cipher = rsa.encrypt(plain)
        return base64.b64encode(cipher)

def rsa_decrypt(cipher):
    with open('private.pem','rb') as f:
        data = f.read()
        key = RSA.importKey(data)
        rsa = PKCS1_v1_5.new(key)
        plain = rsa.decrypt(base64.b64decode(cipher),'ERROR') # 'ERROR'必需
        return plain

if __name__ == '__main__':
    plain_text = b'This_is_a_test_string!'
    cipher = rsa_encrypt(plain_text)
    print(cipher)
    plain = rsa_decrypt(cipher)
    print(plain)

注意:RSA 有两种填充方式,一种是 PKCS1_v1_5,另一种是 PKCS1_OAEP

Hash算法

hashlib 库的用法类似,先实例化某个 Hash 算法,再用 update() 调用就可以了!

具体栗子:

from Crypto.Hash import SHA1,MD5

sha1 = SHA1.new()
sha1.update(b'sha1_test')
print(sha1.digest()) # 返回字节串
print(sha1.hexdigest()) # 返回16进制字符串
md5 = MD5.new()
md5.update(b'md5_test')
print(md5.hexdigest())

数字签名

发送发用私钥签名,验证方用公钥验证

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA

# 签名
message = 'To be signed'
key = RSA.import_key(open('private_key.der').read())
h = SHA256.new(message)
signature = pkcs1_15.new(key).sign(h)

# 验证
key = RSA.import_key(open('public_key.der').read())
h = SHA.new(message)
try:
    pkcs1_15.new(key).verify(h, signature):
    print "The signature is valid."
    except (ValueError, TypeError):
        print "The signature is not valid."

随机数

random 库类似。第一个函数很常用

import Crypto.Random
import Crypto.Random.random

print(Crypto.Random.get_random_bytes(4)) # 得到n字节的随机字节串
print(Crypto.Random.random.randrange(1,10,1)) # x到y之间的整数,可以给定step
print(Crypto.Random.random.randint(1,10)) # x到y之间的整数
print(Crypto.Random.random.getrandbits(16)) # 返回一个最大为N bit的随机整数

其它功能

常用到 Util 中的pad()函数来填充密钥

from Crypto.Util.number import *
from Crypto.Util.Padding import *

# 按照规定的几种类型 pad,自定义 pad可以用 ljust()或者 zfill()
str1 = b'helloworld'
pad_str1 = pad(str1,16,'pkcs7') # 填充类型默认为'pkcs7',还有'iso7816'和'x923'
print(unpad(pad_str1,16))
# number
print(GCD(11,143)) # 最大公约数
print(bytes_to_long(b'hello')) # 字节转整数
print(long_to_bytes(0x41424344)) # 整数转字节
print(getPrime(16)) # 返回一个最大为 N bit 的随机素数
print(getStrongPrime(512)) # 返回强素数
print(inverse(10,5)) # 求逆元
print(isPrime(1227)) # 判断是不是素数

END

--结束END--

本文标题: Crypto算法库详解

本文链接: https://www.lsjlt.com/news/193264.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Crypto算法库详解
    安装与使用 Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3,安装也很简单pip install pyc...
    99+
    2023-01-31
    算法 详解 Crypto
  • Python使用Crypto库实现加密解密的示例详解
    目录一:crypto库安装二:python使用crypto1:crypto的加密解密组件des.py2:crypto组件使用知识补充一:crypto库安装 pycrypto,pycr...
    99+
    2023-01-11
    Python Crypto加密解密 Python Crypto加密 Python Crypto解密 Python Crypto
  • Go语言文档解读:crypto/rand.Int函数详解
    Go语言是一门现代化的编程语言,由于其高效和简单易学的特点,越来越多的开发者开始在项目中使用该语言。在Go语言中,使用随机数是非常常见的需求,而Go语言自带的加密随机数生成器包——crypto/rand中的Int函数,提供了一种生成随机整数...
    99+
    2023-11-03
    Go语言 crypto/rand Int函数
  • JavaScript加密库:Crypto-JS加密/PHP解密
    crypto-js是一个纯JavaScript的加密算法类库,可以非常方便的在前端进行其所支持的加解密操作。 本文附带php后端加密解密操作。 一、引入 crypto-js (点击可下载) 二、前端代码 const key ...
    99+
    2023-09-04
    javascript 前端 crypto-js php 加密解密
  • Vue中使用crypto-jsAES对称加密算法实现加密解密
    目录 下载crypto-js加密解密数据AES算法的ECB模式加密-设置秘钥AES算法的CBC模式加密-设置秘钥和偏移量参考: 在数字加密算法中,通过可划分为对称...
    99+
    2022-11-13
  • C/C++ Crypto密码库调用的实现方法
    目录Sha256加密算法AES 加密与解密AES2 加密:Base64加解密:Hash加密算法RSA加密算法Crypt库实现RSA加密Crypto 库是C/C++的加密算法库,这个加...
    99+
    2022-11-12
  • 遗传算法详解
    1、遗传算法简介   遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是用于解决最优化问题的一种搜索算法。它是模拟达尔文生物进...
    99+
    2023-09-26
    python matplotlib 机器学习
  • python算法演练_One Rule 算法(详解)
    这样某一个特征只有0和1两种取值,数据集有三个类别。当取0的时候,假如类别A有20个这样的个体,类别B有60个这样的个体,类别C有20个这样的个体。所以,这个特征为0时,最有可能的是类别B,但是,还是有40...
    99+
    2022-06-04
    算法 详解 python
  • Vue3diff算法之双端diff算法详解
    目录双端Diff算法双端比较的原理简单Diff的不足双端Diff介绍Diff流程第一次diff第二次diff第三次diff第四次diff双端Diff的优势非理想情况的处理方式添加新元...
    99+
    2022-11-13
  • Java递归算法详解
    递归算法是一种通过调用自身来解决问题的方法。在Java中,递归算法通常有以下几个要素:1. 基本情况:递归方法必须有一个基本情况,即...
    99+
    2023-09-14
    Java
  • HotStuff共识算法详解
    HotStuff共识算法是一种基于拜占廷容错的分布式共识算法,它采用了类似于Raft算法的领导者选举和日志复制机制,并结合了类似于P...
    99+
    2023-09-23
    HotStuff
  • Python 蚁群算法详解
    目录蚁群算法简介TSP问题描述蚁群算法原理代码实现总结 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能...
    99+
    2022-11-12
  • C# 递归算法详解
    目录1)1、1、2、3、5、8.......用递归算法求第30位数的值?2)编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)斐波那契数列为:0、1、1、2、3、……...
    99+
    2022-11-12
  • React的调和算法Diffing算法策略详解
    目录算法策略单节点diffing数组节点diffingkey值的使用要求算法策略 React的调和算法,主要发生在render阶段,调和算法并不是一个特定的算法函数,而是指在调和过程...
    99+
    2022-11-12
  • node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen); 解决方法
    Error: error:0308010C:digital envelope routines::unsupported B站尚硅谷尚医通项目P101 在nuxt使用npm run dev时出现: node:internal/crypto/...
    99+
    2023-09-09
    java javascript npm node.js
  • 七大排序算法详解
    1.概念 1.排序的稳定性 常见的稳定的排序有三种:直接插入排序,冒泡排序,归并排序 对于一组数据元素排列,使用某种排序算法对它进行排序,若相同数据之间的前后位置排序后和未排序之前是相同的,我们就...
    99+
    2023-09-10
    排序算法 算法 数据结构
  • Java DFA算法案例详解
    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: 直接将敏感词组织成String后,利用indexOf方法来查询。 传统的敏感词入库后SQL查询。 ...
    99+
    2022-11-12
  • Java的递归算法详解
    目录一、介绍1、介绍2、案例二、迷宫问题三、八皇后问题四、汉诺塔问题1、问题2、思想3、代码总结一、介绍 1、介绍 递归:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助...
    99+
    2022-11-12
  • C# AStar寻路算法详解
    目录概述思路代码示例位置定义方向定义估值函数节点定义算法上下文定义寻路算法初始化获取路径寻路完整代码概述 AStar算法是一种图形搜索算法,常用于寻路。他是以广度优先搜索为基础,集D...
    99+
    2023-05-14
    C# AStar寻路算法 C# A*寻路算法 C# 寻路算法
  • Python实现KPM算法详解
    目录知识点说明:一、要获取KPM算法的next[]数组二、KMP函数知识点说明: 先说前缀,和后缀吧 比如有一个串:abab 则在下标为3处的(前缀和后缀都要比下标出的长度小1,此处...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作