如何在Lua中实现RSA加密?现有加密代码结果异常求排查
Lua RSA加密问题排查及可用代码示例
现有代码错误点
- 公钥导入逻辑错误:调用
getPublicKey仅传入了Modulus参数,RSA公钥必须同时传入模数(Modulus)和指数(Exponent)两个参数才能正确生成,缺失参数会导致公钥加载失败。 - 指数未正确定义:代码中
IVVee = AQAB未给AQAB加引号,会被识别为未定义的全局变量,AQAB是Base64编码的公钥指数(对应十进制65537,是通用公钥指数),需要作为字符串传入。 - 加密参数传递错误:
encrypt方法的第二个参数应为加密填充方式(支付场景通常使用PKCS1填充),不是公钥指数,参数错传会导致加密逻辑异常。 - 变量作用域不规范:rsa变量未加local声明,会污染全局作用域,也可能导致上下文变量冲突。
修正后可用代码示例
-- 配置项:替换为你自己的完整公钥参数 local PUBLIC_EXPONENT = "AQAB" local PUBLIC_MODULUS = "1EYDa43a8My50miTEK2miAzw8Rl/1HqG+XT0LuBdoKtZLdKe35xAOlr0DTk/Bp6..." -- 待加密的6位支付验证码 local verifyCode = "123456" function RSAPaymentEncrypt(data) -- 入参校验 if not data or type(data) ~= "string" then return nil, "无效的加密入参" end -- 初始化RSA实例 local rsa = vpos.crypt.RSA() if not rsa then return nil, "RSA实例初始化失败" end -- 导入公钥:同时传入模数和指数 local loadSucc = rsa:getPublicKey(PUBLIC_MODULUS, PUBLIC_EXPONENT) if not loadSucc then return nil, "公钥加载失败,请检查参数完整性和格式" end -- 加密:使用支付场景通用的PKCS1填充,按需调整填充常量和你的库定义对齐 local encrypted = rsa:encrypt(data, vpos.crypt.RSA_PKCS1_PADDING) -- 若需要Base64编码后的加密结果用于传输,可启用下面一行代码,适配你的环境Base64工具即可 -- encrypted = vpos.util.base64Encode(encrypted) return encrypted end -- 调用测试 local result, err = RSAPaymentEncrypt(verifyCode) if result then print("加密成功,结果长度:" .. string.len(result)) -- 业务逻辑:将result传入支付接口 else print("加密失败:" .. err) end
额外注意事项
- 你当前返回的1281是公钥加载失败后的错误码,修正公钥导入逻辑后即可解决。
- 1024位RSA加密后的二进制结果长度固定为128字节,2048位为256字节,转Base64编码后长度会增加约1/3,和这个长度不符即可判定加密异常。
- 支付场景禁止使用无填充模式加密,必须使用PKCS1或者OAEP填充,避免被明文攻击。
内容的提问来源于stack exchange,提问作者Ali YILDIZ
相关产品推荐
相关产品推荐

