千家信息网

怎么使用python中的pycrypto算法加密

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,今天小编给大家分享一下怎么使用python中的pycrypto算法加密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所
千家信息网最后更新 2025年01月18日怎么使用python中的pycrypto算法加密

今天小编给大家分享一下怎么使用python中的pycrypto算法加密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、安装

  • pycryto能实现大致3种类型的数据加密(单向加密、对称加密 和非对称加密),产生随机数,生成密钥对,数字签名

  • 单向加密:Crypto.Hash,其中中包含MD5、SHA1、SHA256等

  • 对称加密:Crypto.Cipher如常见的DES等

  • 非对称加密:Crypto.Cipher如常见的AES加密等

  • 随机数操作:Crypto.Random也可以使用Python内置的random模块和secrets模块产生

  • 数字签名与验签:可能需要使用到 Crypto.PublicKey,Crypto.Hash,Crypto.Signature

pip install pycryto

二、AES 加密解密

  • 可以使用 AES.new(key, Mode, IV) 进行加密设置

  • key:长度必须是16、24、或32位

  • VI:长度只能是16位

  • 解密时必须要知道加密时使用的key和IV,再通过decrypt()方法进行解密

from Crypto.Cipher import AES# 加密aes = AES.new('this is a key 11', AES.MODE_CBC, 'this is a iv 222')string = 'autofelix is god'# encrypt()方法要求被加密的字符串必须也是16、24或32位的长度;所以一般要对被加密串进行处理result = aes.encrypt(string)# 解密aes.decrypt(result)

三、SHA加密

from Crypto.Hash import SHA256hash = SHA256.new()hash.update('Hello, World!')# 使用digest()方法加密digest = hash.digest()# 使用hexdigest()方法加密,该方法加密后是16进制的hexdigest = hash.hexdigest()print(digest, hexdigest)

四、RSA算法生成密钥对

  • RSA是一种公钥密码算法

  • RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也就是将明文和自己做E次乘法,然后再将其结果除以 N 求余数,余数就是密文。RSA是一个简洁的加密算法。E 和 N 的组合就是公钥

  • 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥

from Crypto import Randomfrom Crypto.PublicKey import RSA# 获取一个伪随机数生成器random_generator = Random.new().read# 获取一个rsa算法对应的密钥对生成器实例rsa = RSA.generate(1024, random_generator)# 生成私钥并保存private_pem = rsa.exportKey()with open('rsa.key', 'w') as f:f.write(private_pem)# 生成公钥并保存public_pem = rsa.publickey().exportKey()with open('rsa.pub', 'w') as f:f.write(public_pem)# 私钥 rsa.key 结果大概如下# -----BEGIN RSA PRIVATE KEY-----# MIICXQIBAAKBgQDR4Wq9l44lw/thTPyFmSi2hII92EPh90yGXQNL5e7zJPD16j6Q# # tr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11r2GgDgxKfUByetNG4XqJeUKk# kJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcNlHLCnOD7jbMAovJg/QIDAQAB# AoGBAIz8V6+0NxC3bg4WoSs9j1PL/5F7zV3lucoogSZi9vjuP89x40Vi/a9XCxye# bHi2lSYEz3P92jQ7QuqIBx6gSCi3p2HLjD5LyQeSSMbPe8KSlf52dBUaPthbBceA# IJSBDrE8MKGpulTQKAJ7K3zQUOP2ZZgcKxq2jcQgS6iTENIBAkEA5r7emvwuL0Ob# Maav4o1Ovb5c6OL7bSm1tuLPSKl05WuNYfE6LkqiwOOn5lPvsqhwyI1dJeywVeQz# E+PvcTUR7QJBAOjZ8PxnP5T14fuhbfko4d24Ev+iiTBdq3pMXWvobEFL1ljV6aYE# 2JAiMjO/Fzd1WgZhWPa3P+diyTs9mART6VECQQC0LeEXdsn9oDYEbFu1dZBB++8C# 75NTJ5m8iJlB7QjZyMUq8Ln0wdUa9+n4ohxvDraa9EADSDJdr4bvBjLH3J/1AkBr# 9QfO7kvDU5DXqoujVnoJ4xsj3IbAnt0vEZLKwfLW/0M84si2SU7i3IfsB+/KraT0# ilPF50ZAkEN+LNt7PjBRAkAHBBPME7IbFqxi5Cc/6R12DOMiJbOLDTS12b1J1cwG# p8WMIERsvwWdJw+4NdqjbJcjzeGrXhDBi//JU902TAwy# -----END RSA PRIVATE KEY-----# 公钥 rsa.pub 结果大概如下# -----BEGIN PUBLIC KEY-----# # MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR4Wq9l44lw/thTPyFmSi2hII9# 2EPh90yGXQNL5e7zJPD16j6Qtr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11# r2GgDgxKfUByetNG4XqJeUKkkJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcN# lHLCnOD7jbMAovJg/QIDAQAB# -----END PUBLIC KEY-----

五、使用密钥对加密解密

  • 通常通信的时候,发送者使用接受者的公钥加密,接受者使用接受者私钥解密

import cgi, base64from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256import hashlib# 要加密的字符串message = 'autofelix is god'# 使用公钥对内容进行 rsa 加密with open('rsa.pub') as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)cipher_text = base64.b64encode(cipher.encrypt(message))print(cipher_text)# 使用私钥对内容进行 rsa 解密with open('rsa.key') as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)text = cipher.decrypt(base64.b64decode(encrypt_text), random_generator)print(text)

六、加签和验签

import datetime, randomimport requestsimport hashlibimport json, base64from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256from Crypto.Cipher import AES# 加签def sign(signflag,keypath,baseRequest):# http请求bodyprint(baseRequest)# 加签标志if not signflag:return baseRequestelse:# 取请求体中的业务数据businessdata = json.dumps(baseRequest["data"])# 读取私钥(.key格式,可使用openssl或java.keytools产生)with open(keypath,'r') as rsaKeyFile:rsaKey = rsaKeyFile.read().replace("\n",'')print(rsaKey)rsaKeyBytes = base64.b64decode(rsaKey)print(rsaKeyBytes)# SHA256摘要,RSA加密priKey = RSA.importKey(rsaKeyBytes)signer = PKCS1_v1_5.new(priKey)hash_obj = SHA256.new(business_data.encode('utf-8'))signature = base64.b64encode(signer.sign(hash_obj))print(signature)# 把签名加进请求体并返回baseRequest['sign'] = signature.decode()print(baseRequest)return baseRequest# 验签def validata(signflag,cerpath,res):if not signflag:return reselse:# 取业务数据和签名data = res['data']sign = res['sign']# 此处cer已转换成pem格式,使用openssl工具# openssl x509 -inform der -pubkey -noout -in xxxxx.cer>xxxxx.pemcert = open(cerpath).read().replace("-----BEGIN PUBLIC KEY-----\n","").replace("-----END PUBLIC KEY-----\n","").replace("\n","")print(cert)# 验签逻辑同加签pubBytes = base64.b64decode(cert)pubKey = RSA.importKey(pubBytes)signer = SHA256.new(json.dumps(data).encode("utf-8"))verifier = PKCS1_v1_5.new(pubKey)return verifier.verify(signer,base64.b64decode(sign))

以上就是"怎么使用python中的pycrypto算法加密"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

0