以Crypto++实现RSA加解密二进制数据
网上一大片讲怎么加解密字符串的,找了大半天也没找到讲加解密二进制数据的,于是自己研究了下,分享给大家。
加解密函数:
#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加解密二进制数据的更多相关文章
- 全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件
作者: zyl910 一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时. 由于 .Net.J ...
- 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿
[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...
- rsa加解密的内容超长的问题解决
一. 现象: 有一段老代码用来加密的,但是在使用key A的时候,抛出了异常:javax.crypto.IllegalBlockSizeException: Data must not be ...
- Rsa加解密Java、C#、php通用代码 密钥转换工具
之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...
- PHP RSA加解密详解(附代码)
前言:RSA加密一般用在涉及到重要数据时所使用的加密算法,比如用户的账户密码传输,订单的相关数据传输等. 加密方式说明:公钥加密,私钥解密.也可以 私钥加密,公钥解密 一.RSA简介 RSA公钥加密 ...
- RSA加解密算法以及密钥格式
RSA算法: 有个文章关于RSA原理讲的不错: https://blog.csdn.net/dbs1215/article/details/48953589 http://www.ruanyifeng ...
- C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密
前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...
- openssl在多平台和多语言之间进行RSA加解密注意事项
首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...
- RSA加解密&RSA加验签详解
RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一.RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已 ...
随机推荐
- nutch和solr集成
Linux下的Nutch和solr集成 3.1.Nutch安装 l 解压 tar -zxvf apache-nutch-1.4-bin.tar.gz l 终端下cd到目录 apache-nutch- ...
- C++编程规范之17:避免使用“魔数”
摘要: 程序设计并非魔术,所以不要故弄玄虚,要避免在代码中使用诸如42和3.1415926这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式 ...
- 【调试技巧】FireFox作为移动端的设置
1.在地址栏输入“about:config”,按下回车进入设置菜单. 2.找到“general.useragent.override”,如果没有这一项,则点右键“新建”->“字符串”,输入这个字 ...
- JAVA 将接口的引用指向实现类的对象
有一个很简单的例子,java.util中的类ArrayList实现了接口List则生成ArrayList对象时可用以下语句. List list=new ArrayList(); 也就是说所有实现了接 ...
- Pythn中的super用法
在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: 代码如下: class A: def __init__(self): p ...
- 强制转https
原文:http://blog.csdn.net/wzy_1988/article/details/8549290 需求简介 基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.co ...
- AgileEAS.NET SOA中间件平台/敏捷软件开发平台 and SQL详解
AgileEAS.NET SOA中间件平台/敏捷软件开发平台 http://www.smarteas.net/ SQL详解: http://www.w3school.com.cn/sql/func_d ...
- tomcat程序记录客户端真实IP
需求: 开发告知:让后端tomcat日志获取真实的IP,而不是nginx 服务器的IP tomcat前面是nginx做的反向代理,所以tomcat取到的是nginx的ip. 日志名称是localhos ...
- IO-File 文件 目录 基本操作 递归 遍历
创建和删除 //创建文件 File file1 = new File("不存在的文件.txt");//注意,这一步并没有创建文件,只是把磁盘中的文件封装成了一个对象 System. ...
- django: db howto - 1
以在 Django 中使用 MySQL 为例,首先要安装 MySQL 和 MySQL-python 组件,确保 python 能执行 import MySQLdb. MySQL 中创建数据库: [ro ...