前言
很好笑,过度信任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); //主要对这句代码进行讲述
};
- 这里根据代码提供的信息可以知道,return的值是经过了base64编码的,所以在后端进行解密的时候需要base64解码
- 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)
最终输出结果:
总结
也不是什么大问题)纯属就是我学东西学的不精通,反正记录一下,可能也会拯救某个跟我一样步入迷途的小萌新呢