openssl从内存中读取私钥进行签名

麻痹的找了好久,真恶心!

#include <stdio.h>
#include <stdlib.h>
#ifdef WIN32
#include <windows.h>
#endif
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "Base64.h"
#ifdef WIN32
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Gdi32.lib")
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"ssleay32.lib")
#endif

// 私钥解密
std::string rsa_pri_decrypt(const std::string &cipherText, const std::string &priKey)
{
std::string strRet;
RSA *rsa = RSA_new();
BIO *keybio;
keybio = BIO_new_mem_buf((unsigned char *)priKey.c_str(), -1); 

// 此处有三种方法
// 1, 读取内存里生成的密钥对,再从内存生成rsa
// 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
// 3,直接从读取文件指针生成rsa
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); 

int len = RSA_size(rsa);
char *decryptedText = (char *)malloc(len + 1);
memset(decryptedText, 0, len + 1); 

// 解密函数
int ret = RSA_private_decrypt(cipherText.length(), (const unsigned char*)cipherText.c_str(), (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
if (ret >= 0)
strRet = std::string(decryptedText, ret); 

// 释放内存
free(decryptedText);
BIO_free_all(keybio);
RSA_free(rsa); 

return strRet;
}

参考地址:https://www.cnblogs.com/yuandaozhe/p/10114948.html

原文地址:https://www.cnblogs.com/wainiwann/p/10986487.html

时间: 2024-07-31 19:29:04

openssl从内存中读取私钥进行签名的相关文章

ffmpeg 从内存中读取数据

http://blog.csdn.net/leixiaohua1020/article/details/12980423 ffmpeg一般情况下支持打开一个本地文件,例如"C:\test.avi" 或者是一个流媒体协议的URL,例如"rtmp://222.31.64.208/vod/test.flv" 其打开文件的函数是avformat_open_input(),直接将文件路径或者流媒体URL的字符串传递给该函数就可以了. 但其是否支持从内存中读取数据呢?这个问题困

C# 操作地址 从内存中读取写入数据(初级)

本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光地址都是变的, 唯一不变的基址1, 我们要通过CE工具找到基址1的地址, 可以算出阳光的地址. 基址2的地址 = 基址1中的值 + 偏移1; 阳光的的地址 = 基址2中的值 + 偏移2; 以下为简单示例:  窗口界面一个按钮 和 一个定时器 using System; using System.Co

Windows口令安全与破解之--Getpass本地内存中读取windows口令

[实验目的] 1).理解Getpass本地内存中读取windows口令的原理 2)学习Getpass本地内存中读取windows口令的过程 [实验原理] 我们之前学习的是通过获得SAM,破解SAM来获得管理口令,今天我们介绍的是getpass这款软件,在2012年被开发出来,可以直接从 lsass.exe 里获取windows处于active状态账号明文密码.比破解SAM更快,更准. [实验环境] Getpass常用于黑客在已经获得目标系统webshell,且拥有system权限时的操作,此次实

数据库的应用——直接从内存中读取osg节点 (转)

数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件中用osg的osgDB::readNodeFile()读取,这个方法是可行的,但是却很糟糕.我的初衷是不要经过文件转换. 现在问题解决了,多亏了osg::ReaderWriter提供一个虚函数: virtual ReadResult  readNode (std::istream &, const

在文件中读取私钥和公钥

在做项目中,碰到是给到定的私钥和公钥,我们得把公钥和私钥读出来才可以使用,私钥一般还会有密码! /** * 获取公钥 */ public PublicKey readPublicKey(String cerFileName) { CertificateFactory cf; FileInputStream in; Certificate c; PublicKey pk = null; try { cf = CertificateFactory.getInstance("X.509");

深入理解计算机系统 1.4 处理器读取和解释存储在内存中的指令

到如今,我们的hello.c源程序已经已经被编译系统翻译为可运行对象文件了,这个可运行对象文件叫做hello,被存储在磁盘上.为了在Unix系统上运行可运行文件,我们在一个叫做shell的应用程序中输入它的名字: unix> ./hello hello, world unix> shell程序是一个命令行解释器,它打印出一条提示,等着你输入一条命令行.然后运行命令.如果输入的命令行的第一个单词没有匹配到内建的shell命令.那么shell如果这个单词是一个可运行文件的名字.这个文件应该被载入进

cocos2dx中加载图片资源的方法,和从内存中获取已经加载的图片资源的方法

游戏中通常需要将常用的资源如:声音,图片,plist文件,提前加载进内存,以加快游戏的流畅度 1.预加载声音: SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3"); 加载之后就可以直接播放:SimpleAudioEngine::getInstance()->playBackgroundMusic("boom.mp3"); 2.预加载图片资源: 图片资源的加载分为同步加载

Android逆向之旅---运行时修改内存中的Dalvik指令来改变代码逻辑

一.前言 最近在弄脱壳的时候发现有些加固平台的加固方式是修改了dex文件结构,然后在加载dex到内存的时候,在进行dex格式修复,从而达到了apk保护的效果,那么在dex加载到内存的时候,如何进行dex格式的修复呢?其实原理就是基于运行时修改内存中的Dalvik数据,本文就来用一个简单的例子来介绍一下如何在内存中去修改Dalvik指令代码来改变代码本生的运行逻辑.在讲解本文之前,一定要先看这篇文章:Android中Dex文件格式详解 这篇文章主要介绍了关于Dex文件的格式介绍,这个对于后面修改内

VC++使用CImage在内存中Jpeg转换Bmp图片

VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Libjpeg库在8以后也支持了内存读取和转换,不过使用起来较为麻烦,还需要手动编译,用CImage类完全可以实现,代码更简洁. 实现方法: VC++对Jpeg.Png图片的操作主要使用CImage,相信很多人用过CImage的Load和Save函数从文件读取或保存Jpeg或Png格式的文件,这两个重载