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

加解密函数:

#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. 从MongoDB说起

    近日MongoDB宣布完成新一轮1.5亿美元融资,投资者包括EMC.Salesforce.com.英特尔.Red Hat以及Altimeter Capital等投资机构.作为当今最流行的NoSQL数据 ...

  2. POJ 3723 Conscription

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6325   Accepted: 2184 Desc ...

  3. 关于使用mybatis插件自动生成代码

    1.安装 mybatis 插件: 在 eclipse 中 点击 help-->Install New Software...--> Add --> local  选择插件中eclip ...

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

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

  5. 屏幕分辨率(QQVGA、QVGA、VGA、XGA、WXGA、WUXGA和WSXGA+)

    TFT屏幕 TFT ( Thin Film Transistor 薄膜晶体管) ,是有源矩阵类型液晶显示器(AM-LCD)中的一种,TFT在液晶的背部设置特殊光管,能够“主动的”对屏幕上的各个独立的象 ...

  6. android中发送邮件

    在移动互联网时代,手机邮件已不是什么新鲜事了,我们可以使用内置的Gmail引擎来发送邮件,也可以使用SMTP来发送邮件,下面用一个简单示例来演示邮件的发送,包括单方发送邮件.多方发送邮件以及抄送邮件, ...

  7. Eclipse 4.2 + Tomcat 7.x + JDK 7 搭建Java Web开发环境

    1. 准备工具 Eclipse 4.2 (到官网下载:http://www.eclipse.org/downloads/  要下载Eclipse IDE for Java EE Developers ...

  8. 数据库系统原理及其应用总结---ShinePans

    第一章  数据库概论 1.在数据库管理技术的发展过程中.数据库独立性最高的是"数据库系统"阶段 2.三大经典的数据结构模型是"关系.层次和网状模型" 3.单个用 ...

  9. Mysqldb连接Mysql数据库(转)

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  10. Mac下如何不借助第三方工具实现NTFS分区的可写挂载

    问题背景 我想很多使用Mac的同学都会遇到读写NTFS磁盘的问题,因为默认情况下Mac OSX对NTFS磁盘的挂载方式是只读(read-only)的,因此把一个NTFS格式的磁盘插入到Mac上,是只能 ...