python和JavaScript使用非对称加密RSA

本文介绍了非对称加密算法的基本概念,强调了公开密钥和私有密钥的区别,以及在JavaScript和Python中使用RSA加密和解密的过程,包括使用`JSEncrypt`库和`pycryptodome`模块进行操作。
摘要由CSDN通过智能技术生成

一. 简介

  与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

注意:

  • 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留。
  • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密

二. 非对称特征

常见JavaScript调试算法

  • 搜索关键词 new JSEncrypt()JSEncrypt 等,一般会使用 JSEncrypt 库,会有 new 一个实例对象的操作;
  • 搜索关键词 setPublicKeysetKeysetPrivateKeygetPublicKey 等,一般实现的代码里都含有设置密钥的过程。

三. python使用rsa加密

  1. 安装对应的模块
pip install pycryptodome

  1. 生成对应的私钥文件和公钥文件
from Crypto.PublicKey import RSA
import os

# 未知原因,需要用绝对路径才能创建文件

dirname = os.path.dirname(os.path.abspath(__file__))

# # rsa算法生成实例,中能给1024,2048,3072,建议不要给3072,默认拿到的是私钥
rsa_key = RSA.generate(1024)

# 私钥写入文件
with open(os.path.join(dirname, 'rsa.private.pem'), mode='wb') as f:
    # 输出私钥,把私钥写入文件
    f.write(rsa_key.exportKey())

# 把公钥写入文件
with open(os.path.join(dirname, 'rsa.public.pem'), mode='wb') as f:
    # 用私钥生成公钥,输出公钥,写入文件
    f.write(rsa_key.public_key().exportKey())

2.1 公钥为

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqAI9lhpnWlzqU/yk0o3owQPC1
GURWu7KEZ4ZLOEfLcuMJ7kU/MMitZeP/RAXWFZN2TtAPeT9SUDGopsKfBrVT6DjX
9JHQgfs4rrOwaJ5Fx3baC5nR2ujTs+wnMA9yw8HmJdHBmg5gip56xtGl66vdQaSr
x58pAmv6L7F7D0JORQIDAQAB
-----END PUBLIC KEY-----

2.2 私钥为

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCqAI9lhpnWlzqU/yk0o3owQPC1GURWu7KEZ4ZLOEfLcuMJ7kU/
MMitZeP/RAXWFZN2TtAPeT9SUDGopsKfBrVT6DjX9JHQgfs4rrOwaJ5Fx3baC5nR
2ujTs+wnMA9yw8HmJdHBmg5gip56xtGl66vdQaSrx58pAmv6L7F7D0JORQIDAQAB
AoGABhEMeq4FH6u4d5q1KLsDBNM8cXxJxZlx/GrAMxqxeui37/025ff0/Met6MiG
gMrbdd6jj4wV+kBup4Q4gp5KPMLiBFGYS2TQGxUJSLUJqJ7lRpN8rVHaodBz39Qo
PtW2dpj6ZMOUzO+GNZASD4ZydhSnuLwnEXG80XpkoNfdN4ECQQC5X/ceubPYiYpC
M+DTDo/1brEJeTKpR5hG4QpA5tyFuIVWy2muSetg5t1PvzL8kmGj31xq/h4Sf8Sa
Fd/Gu9lhAkEA6sVDNLI1R2/I+epIZRee/d/3or4omqvq4k+m+lDGoQkkElRC+Dct
/iq2aE3+WTNqGvRF+j6SONerX52pFYprZQJBAJVmBDHdFFbFsoncaatvpxH0nfW2
md/X9Z/aKntYFA4pQj1LPubaaDr2lRJ6U8s+5jY+A6uvFelu07IjQvBV4MECQQCx
beg+2Tg/BxLDHfccv99fS3ciPcj+LFPWOhCeOZIEfp4OZDRA16Mg5jL5XYiO7baR
LG/+km98GjLgjo0NRJGpAkAv3p1e/+31D7R/lDKcT6J/KD/rmg3DgYrhqhZTkrdK
x914St005ZsGzfzRu3zZ/NBX2+gUNZiLBimA77oGFMXF
-----END RSA PRIVATE KEY-----
  1. 使用python加密和解密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5  # 加密器
from Crypto import Random
import base64


# 用公钥加密
```python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5  # 加密器
import base64


# 用公钥加密
def encrypt_rsa(data: str):
  """加密"""
  # 直接读取二进制
  with open('rsa.public.pem', mode='rb') as f:
      # 读取公钥
      pk = f.read()
  # 将公钥进行加载,加载成rsa类型的东西
  rsa_pk = RSA.importKey(pk)  # <Crypto.Cipher.PKCS1_v1_5.PKCS115_Cipher object at 0x0000018B41BD0FD0>
  # 用公钥生成加密器
  rsa_ = PKCS1_v1_5.new(key=rsa_pk)
  # 生成密文
  result = rsa_.encrypt(data.encode('utf-8'))
  # 生成base64字符串方便传输
  b64_result = base64.b64encode(result).decode("utf-8")
  return b64_result


def decrypt_rsa(data: str):
  """解密"""
  # 直接读取二进制
  with open('rsa.private.pem', mode='rb') as f:
      # 读取私密文件
      pri_key_bytes = f.read()
  # 把字节的秘钥处理成RSA_KEY
  pri_key = RSA.import_key(pri_key_bytes)
  # 创建加密对象解密对象
  rsa_ = PKCS1_v1_5.new(key=pri_key)
  # 先把b64类型的字符串转换为字节,然后解密成字节类型,然后解码为明文
  mingwen = rsa_.decrypt(base64.b64decode(data), None).decode("utf-8")
  return mingwen


if __name__ == '__main__':
  # 明文
  data = '今天又是充满七万的一天'
  # 加密
  data_rsa = encrypt_rsa(data)

  print(data_rsa)  # 不是固定的
  # 解密
  data_mingwen = decrypt_rsa(data_rsa)

  print(data_mingwen)  # 今天又是充满七万的一天


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值