跳转至

26 rsa 加密算法

作者:王城钧 | 最后修改:2026-04-14

一、rsa 概述

rsa 作为非对称加密算法,核心是基于大数分解的数学难题,通过一对数学相关且无法相互推导的公钥和私钥实现加解密与签名验证:公钥可公开用于加密数据或验证签名,私钥由持有者保密用于解密数据或生成签名,因大合数分解为原始大质数的难度极高,保障了加密的安全性。

二、演示功能概述

本文将演示 rsa 的加密、解密、签名、验签功能

三、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

在开始实践本示例之前,先筹备一下软件环境:

  1. Luatools 工具

  2. 内核固件文件(底层 core 固件文件):

本demo开发测试时使用的固件为LuatOS-SoC_V2018_Air780EHV_1.soc,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

  1. luatos 需要的脚本和资源文件

脚本和资源文件点我查看 demo 地址

lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air780EHV 核心板,将本篇文章中演示使用的项目文件烧录到 Air780EHV 核心板中。

五、API 接口说明

rsa-api 地址

六、代码示例介绍

6.1 功能测试核心代码

local function rsa_task()
    -- 此处延时2秒是为了方便观察日志,非必须
    sys.wait(2000)

    -- 检查是否带rsa库, 没有就提醒一下吧
    if not rsa then
        log.warn("main", "this demo need rsa lib!!!")
        return
    end

    -- 读取公钥并马上加密数据
    local res = rsa.encrypt((io.readFile("/luadb/public.pem")), "abc")
    -- 打印结果
    log.info("rsa", "encrypt", res and #res or 0, res and res:toHex() or "")

    -- 下面是解密, 通常不会在设备端进行, 这里主要是演示用法, 会很慢
    if res then
        -- 读取私钥, 然后解码数据
        local dst = rsa.decrypt((io.readFile("/luadb/privkey.pem")), res, "")
        log.info("rsa", "decrypt", dst and #dst or 0, dst and dst:toHex() or "")
    end

    -- 演示签名和验签
    local hash = crypto.sha1("1234567890"):fromHex()
    -- 签名通常很慢, 通常是服务器做
    local sig = rsa.sign((io.readFile("/luadb/privkey.pem")), rsa.MD_SHA1, hash, "")
    log.info("rsa", "sign", sig and #sig or 0, sig and sig:toHex() or "")
    if sig then
        -- 验签是很快的
        local ret = rsa.verify((io.readFile("/luadb/public.pem")), rsa.MD_SHA1, hash, sig)
        log.info("rsa", "verify", ret)
    end
end

--创建并且启动一个task
--运行这个task的处理函数rsa_task
sys.taskInit(rsa_task)

6.2 功能验证

通过 luatools 工具查看相关日志:

七、总结

至此,本示例详细介绍了如何使用 rsa 核心库进行功能测试开发。