openssl从内存中读取RSA公钥

2023-10-27

背景:近期需要在项目中进行RSA签名验证,厂商会给出pem格式的RSA公钥。在以往项目中使用openssl读取RSA公钥时基本都是从pem文件中读取,基本没什么问题,可最近由于项目需要需要从数据库中读取RSA公钥,经查资料发现openssl提供了bio接口以支持各种形式的秘钥读取。

在使用bio接口从内存中读取pem格式的公钥时,总是读取公钥失败,经不断查找资料,发现在我们得到base64编码的RSA公钥后,从内存中读取这个公钥时要注意以下几点:

(1)公钥字符串开头要加上“-----BEGIN PUBLIC KEY-----\n”,结尾加上“\n-----END PUBLIC KEY-----\n”。否则会出现error:0906D06C:PEM routines:PEM_read_bio:no start line

(2)公钥字符串每隔64个字符要加一个换行,否则会报秘钥格式错误。

c++代码实现举例:

int nPublicKeyLen = strPublicKey.size();      //strPublicKey为base64编码的公钥字符串
for(int i = 64; i < nPublicKeyLen; i+=64)
{
if(strPublicKey[i] != '\n')
{
strPublicKey.insert(i, "\n");
}
i++;
}
strPublicKey.insert(0, "-----BEGIN PUBLIC KEY-----\n");
strPublicKey.append("\n-----END PUBLIC KEY-----\n");

BIO *bio = NULL; 
RSA *rsa = NULL; 
char *chPublicKey = const_cast<char *>(strPublicKey.c_str());
if ((bio = BIO_new_mem_buf(chPublicKey, -1)) == NULL)       //从字符串读取RSA公钥
{     
        cout<<"BIO_new_mem_buf failed!"<<endl;      
}       
rsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);   //从bio结构中得到rsa结构
if (!rsa)
 {
        ERR_load_crypto_strings();
        char errBuf[512];
        ERR_error_string_n(ERR_get_error(), errBuf, sizeof(errBuf));
        cout<< "load public key failed["<<errBuf<<"]"<<endl;
BIO_free_all(bio);
 }

由于使用RSA_vefify函数未能成功验证签名,改为使用evp相关函数进行签名验证。下面贴上使用公钥进行签名验证的代码:

string strBase64DecodedSig = base64_decode(strSignature);                //strSignature为签名
char *chInAppDataSignature = const_cast<char *>(strBase64DecodedSig.c_str());   //签名先进行base64解码
int result = 0;
char *chInAppData = const_cast<char *>(strUnsignedData.c_str());         //strUnsignedData为原始数据,即未加密数据
EVP_PKEY *evpKey = NULL;
EVP_MD_CTX ctx;
evpKey = EVP_PKEY_new();
if(evpKey == NULL)
{
        cout<<"error EVP_PEKY_new"<<endl;
        RSA_free(rsa);
BIO_free_all(bio);return;
 }
 if((result = EVP_PKEY_set1_RSA(evpKey,rsa)) != 1)
{
        cout<<"error EVP_PKEY_set1_RSA"<<endl;
        RSA_free(rsa);
        EVP_PKEY_free(evpKey);
BIO_free_all(bio);return;
 }
 EVP_MD_CTX_init(&ctx);
 if(result == 1 && (result = EVP_VerifyInit_ex(&ctx, EVP_sha1(), NULL)) != 1)
{       
        cout<<"error EVP_VerfyInit_ex"<<endl;
 }
 if(result == 1 && (result = EVP_VerifyUpdate(&ctx, chInAppData,strUnsignedData.size())) != 1)
{
cout<<"error EVP_VerifyUpdate"<<endl;
}
 if(result == 1 && (result = EVP_VerifyFinal(&ctx, (unsigned char *)chInAppDataSignature, strBase64DecodedSig.size(), evpKey)) != 1)
{
cout<<"error EVP_VerifyFinal"<<endl;
}
if(result == 1)
{
cout<<"Verify success"<<endl;
}
else
{
ERR_load_crypto_strings(); 
char errBuf[512]; 
ERR_error_string_n(ERR_get_error(), errBuf, sizeof(errBuf)); 
cout<<"verify failed["<<errBuf<<"]"<<endl;
}
EVP_MD_CTX_cleanup(&ctx);
RSA_free(rsa);
EVP_PKEY_free(evpKey);
BIO_free_all(bio);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openssl从内存中读取RSA公钥 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 爱线段树的好孩子[POI2014]KAR-Cards

    There are nn cards arranged on a table in a certain order Two integers are written on each card one per side the obverse
  • 解决cannot remove ''Operation not permitted

    删除某文件出现cannot remove XXX Operation not permitted lsattr 查看隐藏属性 root iZ2zehlrwqqmoadnuv8ts7Z home wwwroo wwwroot default
  • verilog中#是什么意思?#有什么作用?

    在使用verilog语言进行硬件描述时 你是否也经常用到 这个符号 那么你是否关心过这个符号到底是什么意思呢 它的作用是什么呢 1 可用作参数的传递 我们在进行verilog编程时经常会遇到如下一样的代码块 module study tes
  • -bash: zkServer.sh: command not found

    解决办法 zkServer sh start
  • qt 旋转子窗口 基于QGraphicsView 实现

    感谢 Qt 示例里边的 Box 示例 上图 不要被吓哭哦 X轴旋转 XY轴一起旋转 XYZ轴一起旋转 YZ轴一起旋转 Y轴旋转 XZ轴一起旋转 Z轴旋转 GIF的图有点略多 大家谅解谅解 上代码 http pan baidu com s 1
  • 学习注意力机制【1】

    目录 注意力机制介绍 自注意力机制三个步骤 1 计算注意力分数 Attention Scores 2 计算注意力权重 Attention Weights 3 得到加权和 Weighted Sum 自注意力机制Q K V 注意力机制介绍 At
  • 【JavaWeb】视频播放/下载

    如题 最近和同事联调接口时 收到反馈 ios低版本的视频播放不了 经网上查找其他大佬的解决方案修改 解决了该问题 话不多说 直接上代码 public static void downShowVideo HttpServletRequest
  • Python GUI案例之看图猜成语开发(第三篇)

    Python GUI案例之看图猜成语 第三篇 前言 看图猜成语小程序开发 第三篇 游戏闯关模式页面 Python GUI案例之看图猜成语开发 第一篇 Python GUI案例之看图猜成语开发 第二篇 Python GUI案例之看图猜成语开发
  • 中国“互联网+”大学生创新创业大赛“的实施方案及评审规则

    目录 前言 一 总体要求 一 指导思想 二 基本要求 三 总体目标 二 主要任务和措施 一 提升师资水平 1 增强教师创新创业教育的意识和能力 2 鼓励教师开设创新创业课程和指导创新创业实践 3 鼓励教师创新教学及考核方法 4 吸引校外师资
  • 开源跨平台跨硬件3D打印机

    1 HPGL 文档
  • DWD层 (用户行为日志)

    数仓搭建 DWD层 1 对用户行为数据解析 2 对业务数据采用维度模型重新建模 文章目录 日志解析思路 get json object函数使用 启动日志表 页面日志表 动作日志表 曝光日志表 错误日志表 DWD层用户行为数据加载脚本 日志解
  • Firefly-RK3399安装环境

    文章目录 Firefly RK3399 配置ubuntu环境以及安装Qt PCL OPENcv VTK 一 刷写ubuntu16 04系统 windows下 二 安装Qt Firefly RK3399 三 安装opencv pcl vtk
  • BUUCTF[knife]

    点击题目链接 发现是一句话木马 一句话木马 利用文件上传漏洞 往目标网站上上传木马 即可通过中国蚁剑或中国菜刀获取和控制整个网站主机目录 但很容易被网站防火墙waf拦截 想绕过waf需对木马进行变形 eval 函数 把括号内的字符串 须是合
  • ldconfig命令

    ldconfig命令 动态链接器的管理命令 依次搜索相关目录的动态链接库 lib so 创建动态链接装载程序 ld so或ld linux so 所需的链接和缓存文件 缓存文件 一般是 etc ld so cache 主要记录了动态链接库的
  • list元素

    列表元素 列表元素分为有序列表和无序列表 有序列表 ol order list 有序列表 li list item 列表元素 ol type 1 li 有序列表1 li li 有序列表2 li li 有序列表3 li ol 属性 type
  • [Leetcode] 414. 第三大的数

    题目描述 给定一个非空数组 返回此数组中第三大的数 如果不存在 则返回数组中最大的数 要求算法时间复杂度必须是O n 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释 第三大的数不存在 所
  • 发现一款好用的在线项目管理工具(有免费版)

    注 本文转载自网络 在线项目管理工具指的是不用安装服务器的云部署项目管理软件 这种部署方式的软件可随时开通 节约成本 但质量也参差不齐 考虑到多方面因素 我们公司最终决定用在线的项目管理工具 现在使用的工具是偶然参加展览会发现的 不得不说试
  • java实现远程桌面_?启迪云技术栈

    Openstack面板或命令行提供两种方式来对客户虚拟机进行远程桌面访问 VNC控制台和SPICE HTML5 VNC控制台 Openstack提供一个组件nova novncproxy 它允许用户通过浏览器或vnc客户端来访问虚拟机 通常
  • react函数式组件之兄弟组件中的方法互相调用

    最新更新时间 2022年01月15日14 40 31 猛戳 查看我的博客地图 总有你意想不到的惊喜 本文内容 一个父组件和两个子组件 三个组件都是函数式组件 子组件1需要调用子组件2的方法 同时子组件2需要调用子组件1的方法 技术方案分析
  • openssl从内存中读取RSA公钥

    背景 近期需要在项目中进行RSA签名验证 厂商会给出pem格式的RSA公钥 在以往项目中使用openssl读取RSA公钥时基本都是从pem文件中读取 基本没什么问题 可最近由于项目需要需要从数据库中读取RSA公钥 经查资料发现openssl