关于非堆成加密

理论知识

非对称加密:加密和解密使用的不是同一个秘钥,数据被篡改的可能性非常低
注意:

  1. 加密的秘钥是可以公开给任何人的 -> 公钥
  2. 解密的秘钥是不能给任何人的 -> 私钥
  3. 公钥和私钥是一起生成的,一对,不能分开生成
    网页端,逆向可能会看到的rsa加密逻辑:

rsa的特征:10001/65537

  1. 网易云的逻辑(使用了一个很古老的库)

    setMaxDigits(131),
    d = new RSAKeyPair(b, "", c),
    e = encryptedString(d, a)
    

    经过这一套逻辑计算出来的结果是固定的!

  2. 和python很类似的逻辑(js的第三方库)node-jsencrypt

    var enc = new JSEncrypt()
    enc.setPublicKey()
    enc.encrypt()
  1. 放在下面的例子里

加密的时候,如果出现 encryptLong() 此时需要注意node-jsencrypt不支持encryptLong。需要用一个新库解决:node-encrypt-js

撸代码

Python的非对称加密

import base64
from Crypto.PublicKey import RSA

# 创建rsa密码对
rsa_key = RSA.generate(2048)

# 此时,rsa_key里面装着公钥,私钥
# 先获取公钥

pub_key = rsa_key.publickey().export_key()
# 写入文件
f = open("public.txt", mode="wb")
f.write(pub_key)
f.close()

# 私钥,直接导出就是私钥
pri_key = rsa_key.export_key()
f = open("pri_key.txt", mode="wb")
f.write(pri_key)
f.close()

pub_key = rsa_key.public_key().export_key(format="DER")
print(base64.b64encode(pub_key).decode())
print("------------")
pri_key = rsa_key.export_key()
print(base64.b64encode(pri_key).decode())

默认的PEM秘钥样式,总之就是和SSL证书差不多:

image.png

image.png

设置DER格式的样子,总之就是乱七八糟:

image.png

JS的非对称加密

var JSEncrypt = require("node-jsencrypt")

var enc = new JSEncrypt()

enc.setPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp9klAzVIHt2MLVdjdtSb2MAeioBPbJtUg6tWHybZtFwb/KK1J+AapWyiBAV2FWs7ruiK0HuXmXH5HijtLI4LqUOUNBMtVH/BoCJkj22+iQJg5+o3uqvRoEXceIUgqdXpcz+1dvJCQvDOMP8U1bhd9u4pzOroNZIic9ifzX1D6pGVPzhNPAHc+105AUkKOysGibQYzz148vO+Gxzx5XFtYUtNjDrvfojtEs4hb9aSTjCGkaiupJu4HhyXP9wQ0JUGvQQlvHYTHA+WOPwijOQSS0dPdxmHwSsMguvRRpXQya4OPXnvc+6ydgMZ1TC/DCGGWlaNQm7t0JfiwY6iuA1ipwIDAQAB")
var mi = enc.encrypt("我的新房子真的很棒")
console.log(mi)

需要安装第三方库:

npm install node-jsencrypt

rsa数据加密解密

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

# 加密
s = "我的新家真棒"
# 加载公钥
f = open("public.txt", mode="rb")
pub_key_bs = f.read()
f.close()
rsa_key = RSA.import_key(pub_key_bs)
# 得到rsa_key只能用来加密
rsa_cipher = PKCS1_v1_5.new(key=rsa_key)
result = rsa_cipher.encrypt(s.encode("utf-8")) # result的类型是字节
print(base64.b64encode(result).decode()) # encode之后还是字节,要decode之后才是字符串

mi = "i43hoikMfFaQPxygWbDn+WwXsb1NXhM3kjk58MOYBVAhi5tdLhm/C6RxxYeTonArq6j+1YS+u8myNRiE7B9RM8vKiQHxkp+JFJfB2C54I03D3aNTpKySpU2Dg5/sD5ESc43uBccNDGLXzvE/W/9bww38oFYYkbbcwWVhiP2tOuKq26ExThqGiRnZE9XCzZf5Bc0gYYvTjWGLACURGHyjGdj6bfQBrQSbFpDbR8yrpjNj3Z2NC70z0I9MwfVzkpw490Z4SKqc2ncC/uhnsZlg3RW48E2Axg+dQsCt4rYwEDeGIHL0gsmNtCbPPxlTKucszbHpWe7l/7hxAFRbeHFbxQ=="
f = open("pri_key.txt", mode="rb")
pri_key_bs = f.read()
f.close()
rsa_key = RSA.import_key(pri_key_bs)
rsa_cipher = PKCS1_v1_5.new(key=rsa_key)
ming = rsa_cipher.decrypt(base64.b64decode(mi), None)
print(ming.decode("utf-8"))