网上一大片讲怎么加解密字符串的,找了大半天也没找到讲加解密二进制数据的,于是自己研究了下,分享给大家。

加解密函数:

#include <rsa.h>
#include <randpool.h>
#include <filters.h> void GenerateRSAKey(byte seed[], size_t seedLen, size_t keyLen,
byte privateKey[], size_t &privateKeyLen,
byte publicKey[], size_t &publicKeyLen)
{
CryptoPP::RandomPool randomPool;
randomPool.Put(seed, seedLen); CryptoPP::RSAES_OAEP_SHA_Decryptor decryptor(randomPool, 1024);
CryptoPP::ArraySink decArr(privateKey, privateKeyLen);
decryptor.DEREncode(decArr);
decArr.MessageEnd();
privateKeyLen = decArr.TotalPutLength(); CryptoPP::RSAES_OAEP_SHA_Encryptor encryptor(decryptor);
CryptoPP::ArraySink encArr(publicKey, publicKeyLen);
encryptor.DEREncode(encArr);
encArr.MessageEnd();
publicKeyLen = encArr.TotalPutLength();
} void RSAEncryptData(byte seed[], size_t seedLen, byte publicKey[], size_t publicKeyLen,
byte plainData[], size_t plainDataLen, byte cipherData[], size_t &cipherDataLen)
{
CryptoPP::ArraySource keyArr(publicKey, publicKeyLen, true);
CryptoPP::RSAES_OAEP_SHA_Encryptor enc;
enc.AccessKey().Load(keyArr); CryptoPP::RandomPool randomPool;
randomPool.Put(seed, seedLen); size_t putLen = 0;
size_t fixedLen = enc.FixedMaxPlaintextLength();
for (size_t i = 0; i < plainDataLen; i += fixedLen)
{
size_t len = fixedLen < (plainDataLen - i) ? fixedLen : (plainDataLen - i);
CryptoPP::ArraySink *dstArr = new CryptoPP::ArraySink(cipherData + putLen, cipherDataLen - putLen);
CryptoPP::ArraySource source(plainData + i, len, true, new CryptoPP::PK_EncryptorFilter(randomPool, enc, dstArr));
putLen += dstArr->TotalPutLength();
}
cipherDataLen = putLen;
} void RSADecryptData(byte seed[], size_t seedLen, byte privateKey[], size_t privateKeyLen,
byte cipherData[], size_t cipherDataLen, byte plainData[], size_t &plainDataLen)
{
CryptoPP::ArraySource keyArr(privateKey, privateKeyLen, true);
CryptoPP::RSAES_OAEP_SHA_Decryptor dec;
dec.AccessKey().Load(keyArr); CryptoPP::RandomPool randomPool;
randomPool.Put(seed, seedLen); size_t putLen = 0;
size_t fixedLen = dec.FixedCiphertextLength();
for (size_t i = 0; i < cipherDataLen; i += fixedLen)
{
size_t len = fixedLen < (cipherDataLen - i) ? fixedLen : (cipherDataLen - i);
CryptoPP::ArraySink *dstArr = new CryptoPP::ArraySink(plainData + putLen, plainDataLen - putLen);
CryptoPP::ArraySource source(cipherData + i, len, true, new CryptoPP::PK_DecryptorFilter(randomPool, dec, dstArr));
putLen += dstArr->TotalPutLength();
}
plainDataLen = putLen;
}

  

测试函数:

#include <iostream>
#include <string>
#include "CryptRsa.h" using namespace std;
using namespace CryptoPP; int main(int argc, char *argv)
{
try
{
string plaintext = "{0FA152B4-D176-4D95-8363-BA9DFC787651}";
cout << plaintext << endl;
cout << plaintext.length() << endl;
byte seed[] = { 0xCA, 0xDA, 0x63, 0xEC, 0x9B, 0x89, 0x40, 0xDE, 0x8E, 0x64, 0x94, 0xE8, 0x79, 0xEA, 0x32, 0x9E };
size_t privateKeyLen = 2048;
byte *privateKey = new byte[privateKeyLen];
size_t publicKeyLen = 2048;
byte *publicKey = new byte[publicKeyLen];
GenerateRSAKey(seed, sizeof(seed), 1024, privateKey, privateKeyLen, publicKey, publicKeyLen);
size_t cipherDataLen = 2048;
byte *cipherData = new byte[cipherDataLen];
RSAEncryptData(seed, sizeof(seed), publicKey, publicKeyLen,
(byte*)plaintext.c_str(), plaintext.length(), cipherData, cipherDataLen);
size_t plainDataLen = plaintext.length() * 2;
byte *plainData = new byte[plainDataLen];
RSADecryptData(seed, sizeof(seed), privateKey, privateKeyLen,
cipherData, cipherDataLen, plainData, plainDataLen);
plainData[plainDataLen] = '\0';
cout << (char*)plainData << endl;
cout << plainDataLen << endl; delete[] plainData;
delete[] cipherData;
delete[] publicKey;
delete[] privateKey;
}
catch (std::exception &e)
{
cout << e.what() << endl;
}
cin.get(); return 0;
}

  

以Crypto++实现RSA加解密二进制数据的更多相关文章

  1. 全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

    作者: zyl910 一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时. 由于 .Net.J ...

  2. 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

    [转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...

  3. rsa加解密的内容超长的问题解决

    一. 现象:      有一段老代码用来加密的,但是在使用key A的时候,抛出了异常:javax.crypto.IllegalBlockSizeException: Data must not be ...

  4. Rsa加解密Java、C#、php通用代码 密钥转换工具

    之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...

  5. PHP RSA加解密详解(附代码)

    前言:RSA加密一般用在涉及到重要数据时所使用的加密算法,比如用户的账户密码传输,订单的相关数据传输等. 加密方式说明:公钥加密,私钥解密.也可以  私钥加密,公钥解密 一.RSA简介 RSA公钥加密 ...

  6. RSA加解密算法以及密钥格式

    RSA算法: 有个文章关于RSA原理讲的不错: https://blog.csdn.net/dbs1215/article/details/48953589 http://www.ruanyifeng ...

  7. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  8. openssl在多平台和多语言之间进行RSA加解密注意事项

    首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...

  9. RSA加解密&RSA加验签详解

    RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一.RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已 ...

随机推荐

  1. springboot中的406(Not Acceptable)错误

    今天遇到一个很奇怪的问题,我用springboot开发时,用ajax请求服务想返回json数据,页面总是报406错误,这个错误使我郁闷了很久,原来我的后台服务是这么写的 看到没value的后面有个.h ...

  2. Sequence(组合数学,集合不同元素的个数)

    Sequence [组合数学] 时间限制: 3 Sec  内存限制: 128 MB 提交: 138  解决: 52 [提交][状态][讨论版] 题目描述 在某个夜黑月高的晚上,!!!,原谅我编不下去了 ...

  3. C++中的四种转型操作符

    在具体介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它差点儿同意将不论什么类型转换为不论什么其它类型,这是十分拙劣的.假设每次转型都可以更精确地指明意图,则更好. ②旧式转型难以辨 ...

  4. 四、Solr数据源配置(JNDI、DIH)及定时重做索引

    简介 Solr支持很多种创建索引的方式,包括网页,xml以及数据库,因为我这边做的是企业级的搜索,所以用的是数据库建立索引.其实从数据库建立索引,很大程度上取决于原来的数据库设计. 从数据库建立索引, ...

  5. Tabs( 选项卡)

    一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...

  6. HTML基础总结<头部>

    重点摘录:HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 & ...

  7. ORA-02447: cannot defer a constraint that is not deferrable

    一个constraint如果被定义成deferrable那么这个constraints可以在deferred和imediate两种状态相互转换. deferred只在transaction中有效,也就 ...

  8. unity中数据的持久化存储

    unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...

  9. POJ 1759 Garland(二分+数学递归+坑精度)

    POJ 1759 Garland  这个题wa了27次,忘了用一个数来储存f[n-1],每次由于二分都会改变f[n-1]的值,得到的有的值不精确,直接输出f[n-1]肯定有问题. 这个题用c++交可以 ...

  10. Spring 学习笔记01

    以一个论坛登陆模块来讲解如何使用spring 登陆功能虽然简单,但是模块虽然很小,但是基本包括了一般的web应用的操作.涵盖了持久层数据访问(数据库相关操作).业务层事务管理(数据库操作回滚等).展现 ...