记录被AI补全坑的一次(关于RSA加密)

前言

很好笑,过度信任AI补全了,在完全没有了解RSA加密的情况下前端使用vue+vite(ts),后端使用python(flask),前端加密使用:JSEncrypt,后端解密使用Crypto之下,过分自信地靠AI自动补全,然后排查了几个小时,大部分的error是:ValueError: Ciphertext with incorrect length

分析 & 解决

关于JSEncrypt这个库,网上的资料零零散散我也看了许多,但很少有细致提到重点的,所以这里我自我总结一下,也是留个记录:
(最简单的) RSA加密代码如下:

const public_key = `-----BEGIN PUBLIC KEY-----
这里是公钥
-----END PUBLIC KEY-----
`;

const rsa_encrypt = (text: string) => {
  const encrypt = new JSEncrypt();
  encrypt.setPublicKey(public_key);
  return encrypt.encrypt(text); //主要对这句代码进行讲述
};

在这里插入图片描述

  1. 这里根据代码提供的信息可以知道,return的值是经过了base64编码的,所以在后端进行解密的时候需要base64解码
  2. JSEncrypt的默认填充是PKCS1_v1_5,然后我的AI补全默认使用了PKCS1_OAEP填充,这就导致了在加密和解密的时候出现的长度不正确 (当然也是因为我没搞明白非对称的原理,所以学新知识真的得多看资料)

所以在后端的代码中(最简)解密函数是这样的 (需要提供公钥计算得到的私钥)

def Rsadecrypt(encrypted_message):
    encrypted_message = base64.b64decode(encrypted_message)
    key = RSA.import_key(private_key)
    cipher = PKCS1_v1_5.new(key)
    decrypted_message = cipher.decrypt(encrypted_message, None)
    return decrypted_message.decode('utf-8')

调用测试

前端:

const handleClick = () => {
  const word = rsa_encrypt("你好世界");
  axios.post("/bf/test", { word }).then((res) => {
    console.log(res.data);
  });
};

后端:

# blueprints.py

before = Blueprint('before', __name__,static_folder='static')

@before.route('/test',methods=['POST'])
async def test():
    data = request.get_json().get('word')
    return Rsadecrypt(data)

最终输出结果:
在这里插入图片描述

总结

也不是什么大问题)纯属就是我学东西学的不精通,反正记录一下,可能也会拯救某个跟我一样步入迷途的小萌新呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值