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

加解密函数:

#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. C程序设计语言--指针和引用的区别

    在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...

  2. 常用cl命令参数解释

    紧接前文,第一行cl命令如下: 1> cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG ...

  3. CSS 代码是什么?(转)

    转自:http://www.divcss5.com/rumen/r95.shtml CSS 代码是什么,什么是CSS代码? 目录 什么是CSS css代码样子(图) 作用 相关扩展阅读 一.了解什么是 ...

  4. zookeeper[2] zookeeper原理(转)

    转自:http://cailin.iteye.com/blog/2014486 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现 ...

  5. 对Ul下的li标签执行点击事件——如何获取你所点击的标签

    问题所来:做项目时,一般的数据都是用循环动态加载出来的,结构都是一样的,只是绑定的值不同,如何对相同的标签做处理的问题就来了. 例如:点谁就显示谁的数值 <ul > <li id=& ...

  6. # MongoDB学习笔记(持续更新)

    启动mongo服务 sodo mongo 显示数据库(显示数据库名称和大小,单位GB) > show dbs admin (empty) local 0.078GB test 0.078GB t ...

  7. [Angular 2] Build a select dropdown with *ngFor in Angular 2

    We want the start-pipe more flexable to get param, so when using it, we pass a second param as statu ...

  8. TypedArray和obtainStyledAttributes使用

    在编写Android自定义按钮示例基础上,如果要指定字体大小产生这样的效果: 其实是不需要自定义变量的,可以直接使用TextView的配置属性: <com.easymorse.textbutto ...

  9. mybatis 与 反射

    Mybatis是个优秀的ORM框架,所以它的反射层一定不会让我们失望 图比较大,可以开新页面查看 可以看到,Mybatis对这一块抽象的比较复杂,我们可以看到有几个比较主要的部分:Reflector. ...

  10. DropDownList获取的SelectIndex一直为0

    1.想要DropDownList自动提交必须设置AutoPostBack="true"属性,下面是代码: <asp:DropDownList ID=" AutoPo ...