以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;
}

  

时间: 2024-10-10 09:46:22

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

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

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

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

一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时.由于 .Net.Java 的RSA类库存在很多细节区别,尤其是它们支持的密钥格式不同.导致容易出现“我加密的数据对方不能解密,对方加密的数据我不能解密,但是自身是可以正常加密解密”等情况.虽然网上已经有很多文章讨论 .Net与Java互通的RSA加解密,但是存在不够全面.需要第三方dll.方案复杂 等问题.于是我仔细研究了这一课题,得到了一

java rsa加解密算法的实现

RSAUtils:RSA加解密的实现 package com.rsa.test; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import jav

RSA加解密工具类

Java 实现 import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.secur

PHP RSA加解密示例(转)

1.生成密钥和公钥 开始前需要准备openssl环境 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/ window 下需要安装openssl的程序,传送门http://slproweb.com/products/Win32OpenSSL.html 如果不想安装,可以用本例提供的密钥和公钥进行测试. 密钥生成 openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档. openssl g

【go语言】RSA加解密

关于go语言的RSA加解密的介绍,这里有一篇文章,已经介绍的很完整了. 对应的go语言的加解密代码,参考git. 因为原文跨语言是跟php,我这里要跟c语言进行交互,所以,这里贴上c语言的例子. 参考原文:http://hayageek.com/rsa-encryption-decryption-openssl-c/ #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/rsa.h> #i

C# 中使用 RSA加解密算法

一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的.加密算法E和解密算法D也都是公开的.虽然密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK.正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存:另一个为公开密钥

openssl - rsa加解密例程

原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥,再进行数据解密,得到数据,

Unity加载二进制数据

[Unity加载二进制数据] The first step is to save your binary data file with the ".bytes" extension. unity will treat this file as a TextAsset. As a TextAsset the file can be included when you build your AssetBundle. Once you have downloaded the AssetBun