C++ RSA加解密

2023-11-17

原文链接:https://blog.csdn.net/u011029517/article/details/79392522

之前需要用到RSA加解密的时候花费了我不少的时间,网上有很多RSA加解密的文章,但大多数都是从文件读取公钥或者私钥的,后来花费了不少时间才找到一个从字符串读取公私钥的例子。

#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <stdio.h>
 
int padding = RSA_PKCS1_PADDING;
 
RSA * createRSA(unsigned char * key,int public)
{
    RSA *rsa= NULL;
    BIO *keybio ;
    keybio = BIO_new_mem_buf(key, -1);
    if (keybio==NULL)
    {
        printf( "Failed to create key BIO");
        return 0;
    }
    if(public)
    {
        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
    }
    else
    {
        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
    }
    if(rsa == NULL)
    {
        printf( "Failed to create RSA");
    }
 
    return rsa;
}
 
int public_encrypt(unsigned char * data,int data_len,unsigned char * key, unsigned char *encrypted)
{
    RSA * rsa = createRSA(key,1);
    int result = RSA_public_encrypt(data_len,data,encrypted,rsa,padding);
    return result;
}
int private_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
    RSA * rsa = createRSA(key,0);
    int  result = RSA_private_decrypt(data_len,enc_data,decrypted,rsa,padding);
    return result;
}
 
 
int private_encrypt(unsigned char * data,int data_len,unsigned char * key, unsigned char *encrypted)
{
    RSA * rsa = createRSA(key,0);
    int result = RSA_private_encrypt(data_len,data,encrypted,rsa,padding);
    return result;
}
int public_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
    RSA * rsa = createRSA(key,1);
    int  result = RSA_public_decrypt(data_len,enc_data,decrypted,rsa,padding);
    return result;
}
 
void printLastError(char *msg)
{
    char * err = malloc(130);;
    ERR_load_crypto_strings();
    ERR_error_string(ERR_get_error(), err);
    printf("%s ERROR: %s\n",msg, err);
    free(err);
}
 
int main(){
 
  char plainText[2048/8] = "Hello this is Ravi"; //key length : 2048
 
 char publicKey[]="-----BEGIN PUBLIC KEY-----\n"\
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy8Dbv8prpJ/0kKhlGeJY\n"\
"ozo2t60EG8L0561g13R29LvMR5hyvGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+\n"\
"vw1HocOAZtWK0z3r26uA8kQYOKX9Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQAp\n"\
"fc9jB9nTzphOgM4JiEYvlV8FLhg9yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68\n"\
"i6T4nNq7NWC+UNVjQHxNQMQMzU6lWCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoV\n"\
"PpY72+eVthKzpMeyHkBn7ciumk5qgLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUy\n"\
"wQIDAQAB\n"\
"-----END PUBLIC KEY-----\n";
  
 char privateKey[]="-----BEGIN RSA PRIVATE KEY-----\n"\
"MIIEowIBAAKCAQEAy8Dbv8prpJ/0kKhlGeJYozo2t60EG8L0561g13R29LvMR5hy\n"\
"vGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+vw1HocOAZtWK0z3r26uA8kQYOKX9\n"\
"Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQApfc9jB9nTzphOgM4JiEYvlV8FLhg9\n"\
"yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68i6T4nNq7NWC+UNVjQHxNQMQMzU6l\n"\
"WCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoVPpY72+eVthKzpMeyHkBn7ciumk5q\n"\
"gLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUywQIDAQABAoIBADhg1u1Mv1hAAlX8\n"\
"omz1Gn2f4AAW2aos2cM5UDCNw1SYmj+9SRIkaxjRsE/C4o9sw1oxrg1/z6kajV0e\n"\
"N/t008FdlVKHXAIYWF93JMoVvIpMmT8jft6AN/y3NMpivgt2inmmEJZYNioFJKZG\n"\
"X+/vKYvsVISZm2fw8NfnKvAQK55yu+GRWBZGOeS9K+LbYvOwcrjKhHz66m4bedKd\n"\
"gVAix6NE5iwmjNXktSQlJMCjbtdNXg/xo1/G4kG2p/MO1HLcKfe1N5FgBiXj3Qjl\n"\
"vgvjJZkh1as2KTgaPOBqZaP03738VnYg23ISyvfT/teArVGtxrmFP7939EvJFKpF\n"\
"1wTxuDkCgYEA7t0DR37zt+dEJy+5vm7zSmN97VenwQJFWMiulkHGa0yU3lLasxxu\n"\
"m0oUtndIjenIvSx6t3Y+agK2F3EPbb0AZ5wZ1p1IXs4vktgeQwSSBdqcM8LZFDvZ\n"\
"uPboQnJoRdIkd62XnP5ekIEIBAfOp8v2wFpSfE7nNH2u4CpAXNSF9HsCgYEA2l8D\n"\
"JrDE5m9Kkn+J4l+AdGfeBL1igPF3DnuPoV67BpgiaAgI4h25UJzXiDKKoa706S0D\n"\
"4XB74zOLX11MaGPMIdhlG+SgeQfNoC5lE4ZWXNyESJH1SVgRGT9nBC2vtL6bxCVV\n"\
"WBkTeC5D6c/QXcai6yw6OYyNNdp0uznKURe1xvMCgYBVYYcEjWqMuAvyferFGV+5\n"\
"nWqr5gM+yJMFM2bEqupD/HHSLoeiMm2O8KIKvwSeRYzNohKTdZ7FwgZYxr8fGMoG\n"\
"PxQ1VK9DxCvZL4tRpVaU5Rmknud9hg9DQG6xIbgIDR+f79sb8QjYWmcFGc1SyWOA\n"\
"SkjlykZ2yt4xnqi3BfiD9QKBgGqLgRYXmXp1QoVIBRaWUi55nzHg1XbkWZqPXvz1\n"\
"I3uMLv1jLjJlHk3euKqTPmC05HoApKwSHeA0/gOBmg404xyAYJTDcCidTg6hlF96\n"\
"ZBja3xApZuxqM62F6dV4FQqzFX0WWhWp5n301N33r0qR6FumMKJzmVJ1TA8tmzEF\n"\
"yINRAoGBAJqioYs8rK6eXzA8ywYLjqTLu/yQSLBn/4ta36K8DyCoLNlNxSuox+A5\n"\
"w6z2vEfRVQDq4Hm4vBzjdi3QfYLNkTiTqLcvgWZ+eX44ogXtdTDO7c+GeMKWz4XX\n"\
"uJSUVL5+CVjKLjZEJ6Qc2WZLl94xSwL71E41H4YciVnSCQxVc4Jw\n"\
"-----END RSA PRIVATE KEY-----\n";
 
    
unsigned char  encrypted[4098]={};
unsigned char decrypted[4098]={};
 
int encrypted_length= public_encrypt(plainText,strlen(plainText),publicKey,encrypted);
if(encrypted_length == -1)
{
    printLastError("Public Encrypt failed ");
    exit(0);
}
printf("Encrypted length =%d\n",encrypted_length);
 
int decrypted_length = private_decrypt(encrypted,encrypted_length,privateKey, decrypted);
if(decrypted_length == -1)
{
    printLastError("Private Decrypt failed ");
    exit(0);
}
printf("Decrypted Text =%s\n",decrypted);
printf("Decrypted Length =%d\n",decrypted_length);
 
 
encrypted_length= private_encrypt(plainText,strlen(plainText),privateKey,encrypted);
if(encrypted_length == -1)
{
    printLastError("Private Encrypt failed");
    exit(0);
}
printf("Encrypted length =%d\n",encrypted_length);
 
decrypted_length = public_decrypt(encrypted,encrypted_length,publicKey, decrypted);
if(decrypted_length == -1)
{
    printLastError("Public Decrypt failed");
    exit(0);
}
printf("Decrypted Text =%s\n",decrypted);
printf("Decrypted Length =%d\n",decrypted_length);
 
}

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

C++ RSA加解密 的相关文章

随机推荐

  • 1234. 替换子串得到平衡字符串

    有一个只含有 Q W E R 四种字符 且长度为 n 的字符串 假如在该字符串中 这四个字符都恰好出现 n 4 次 那么它就是一个 平衡字符串 给你一个这样的字符串 s 请通过 替换一个子串 的方式 使原字符串 s 变成一个 平衡字符串 你
  • Markdown预览 代码块自动化加代码行数-VSCode

    Markdown预览 代码块自动化加代码行数 VSCode 官方地址 https shd101wyy github io markdown preview enhanced zh cn markdown basics id 代码行数 第一步
  • JToolBarTest JToolBar 的一个测试类

    package com test JToolBarTest import javax swing JButton import javax swing JFrame import javax swing JToolBar public cl
  • python笔记:变量赋值与注意事项

    1 单个变量赋值 a 变量未赋值会报错 a 1 正确写法 2 多个变量赋值 方法1 a b c 1 方法2 a b c 1 1 1 print a b c 1 1 1 3 基本变量类型 五大类 字符串 string 数字 Numeric 列
  • 第1章 NumPy基础

    为何第1章介绍NumPy基础 在机器学习和深度学习中 图像 声音 文本等首先要数字化 如何实现数字化 数字化后如何处理 这些都涉及NumPy NumPy是数据科学的通用语言 它是科学计算 矩阵运算 深度学习的基石 PyTorch中的重要概念
  • 分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践

    分布式消息队列RocketMQ 事务消息 解决分布式事务的最佳实践 标签 事务消息exactlyRocketMQKafka分布式消息队列 2016 12 23 22 08 7789人阅读 评论 8 收藏 举报 分类 分布式消息队列Rocke
  • Windows Server2012R2 VisualSVN3.9.7-Server在线修改密码搭建

    经过核验 按下面这样的方式去升级 从3 0 0升级到3 9 7 同时支持用户通过web界面修改密码 每个用户忘记密码要管理员来修改 工作量不大 但真的是耗时费力 还不讨好 1 安装软件准备 1 1 软件准备 1 Windows Server
  • 自动化测试系列 —— UI自动化测试

    UI 测试是一种测试类型 也称为用户界面测试 通过该测试 我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG 了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要 通过执行 UI 测试 测试人
  • 【数据结构】串

    串 串的顺序实现 简单的模式匹配算法 KMP算法 KMP算法的进一步优化 串的顺序实现 初始化 define MaxSize 50 typedef char ElemType 顺序存储表示 typedef struct ElemType d
  • Klocwork安装

    简单介绍一下Klocwork在windows下的安装 操作系统是win7 Klocwork的版本是10 0 第一步 由于Klocwork的安装程序已十分成熟 所以在安装之前不需要什么准备共走 双击Klocwork的安装包 会出现下图的安装引
  • java实现顺序表

    顺序表是在计算机内存中以数组的形式保存的线性表 是指用一组地址连续的存储单元依次存储数据元素的线性结构 线性表采用顺序存储的方式存储就称之为顺序表 顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中 1 创建一个顺序表 cl
  • 一个常见的Spring IOC疑难症状

    b size x large Case size b 请看下面的IOC实例 1 AaaService实现AaaaInterface接口 2 在BaaService中Autowired AaaService b size large Code
  • linux参数传入awk,linux awk命令--如何引入外部变量

    目标 用shell命令删除目录下文件 但是排除某些特殊文件 第一时间无脑从谷歌获取 rm ls txt grep v test txt 或者 rm ls txt egrep v test txt 或者 rm ls txt awk if 0
  • python实现新闻网站_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)

    1 场景 经常有小伙伴在交流群问我 每天的早报新闻是怎么获取的 其实 早期使用的方案 是利用爬虫获取到一些新闻网站的标题 然后做了一些简单的数据清洗 最后利用 itchat 发送到指定的社群中 由于爬虫面对 网站改版的不稳定性及 itcha
  • 全额限定名

    全额限定名说白了就是路径名 全额限定名 java lang String class文件中就是 java lang String pathname2classname classname2pathname
  • java 异常 理解_java异常理解(1)

    JAVA异常处理机制 1引子 try catch finally恐怕是大家再熟悉不过的语句了 而且感觉用起来也是很简单 逻辑上似乎也是很容易理解 不过 我亲自体验的 教训 告诉我 这个东西可不是想象中的那么简单 听话 不信 那你看看下面的代
  • 光流估计(对视频处理+python实现+原理+实验报告)

    资源 光流估计 对视频处理 python实现 原理 实验报告 实现效果 相关原理 光流是空间运动物体在观测成像平面上的像素运动的 瞬时速度 根据各个像素点的速度矢量特征 可以对图像进行动态分析 例如目标跟踪 亮度恒定 同一点随苕时间的变化
  • 植被物候参数遥感研究进展(好文分享)

    在气候变化背景下 植被物候作为生态系统对环境变化响应的直接体现方式 日益受到学界关注 获取长期 连续 多尺度的植被物候数据是物候研究的基础 而利用卫星遥感手段获取的物候参数已经成为陆地生态系统变化研究的重要指标 遥感物候参数在农业生产管理
  • 530 Please login with USER and PASS.

    安装 npm install save hexo deployer ftpsync 配置 deploy type ftpsync host xx xx xx xx user bxu123123 pass xx11123 remote htd
  • C++ RSA加解密

    原文链接 https blog csdn net u011029517 article details 79392522 之前需要用到RSA加解密的时候花费了我不少的时间 网上有很多RSA加解密的文章 但大多数都是从文件读取公钥或者私钥的