You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:48:01