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

加解密函数:

#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. freeCMS学习网站

    https://code.google.com/p/freecms/downloads/list

  2. hadoop2.2.0伪分布模式64位安装

    hadoop2.2.0伪分布模式64位安装用到的软件:jdk-6u45-linux-x64.bin,hadoop-2.2.0.x86_64.tar.gz 修改主机名vim /etc/sysconfig ...

  3. Python读取txt文件

    Python读取txt文件,有两种方式: (1)逐行读取 data=open("data.txt") line=data.readline() while line: print ...

  4. PHP各版本之间差异

    PHP5.3 __toString 魔术方法不再接受参数. 魔术方法 __get, __set, __isset, __unset, and __call 应该总是公共的(public)且不能是静态的 ...

  5. 解决html5新标签【placeholder】低版本浏览器下不兼容问题

    placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 实例:1 <input ...

  6. CMA连续物理内存用户空间映射---(一)

    背景: 在多媒体和图像处理等应用中,经经常使用到大块内存,尤其是硬件编解码.须要内核分配大块的物理连续内存. 这里希望通过把从内核分配的连续物理内存映射到用户空间.在用户空间经过处理,又能够入队到驱动 ...

  7. i++与++i的区别,使用实例说明

    /** * 类名:TEST.java<br> * <p> * 功能:i++与++i的区别,使用实例说明 * </p> * * @Author:<a href= ...

  8. c# winform InvokeRequired 解决跨线程访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...

  9. HashMap的分析(转)

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

  10. C# XML流操作简单实例

    这里我们先介绍操作XML文件的两个对象:XmlTextReader和XmlTextWriter打开和读取Xml文件使用到的对象就是XmlTextReader对象.下面的例子打开了与程序在同一路径下的一 ...