Crypto++安装和简单使用RSA加密解密
Crypto++安装和简单使⽤RSA加密解密
Crypto++安装和简单使⽤
⼀、前⾔
能搜索这个的估计都知道这库是⼲嘛⽤的,不知道去Wiki下。
之前在很多地⽅查了很多资料,但感觉有些繁琐,⽽且⽤的时候⼜不说为什么这么⽤,虽然能⽤,但是⼀脸懵。所以捣⿎了很久,感觉还是写个博客记录下⾃⼰安装和使⽤的过程。
讲道理,这安装是真的⿇烦,本来还想在Qt上直接⽤的。
其实这个博客讲得还不错,可以先看看这个,我刚开始也是参照它的来做的。
另外,本⽂是在Windows + MSVC环境下使⽤。
⼆、下载
Github下载请选择源码(也只有源码),这⾥我下的是zip格式的包,下载完成后解压。
(⼀)
(⼆)
解压完成后会有⼀堆东西:
三、安装
打开那个.sln⼯程⽂件,这⾥我⽤的是⚠,⽆视它。
在⼯程树⽬录(解决⽅案)有4个项⽬,到cryptolib,右键选择
注意,此时默认⽣成模式是Release+Win32,你的可能是Release+
分别在Debug和Release模式下的Win32 ||
个lib,位于解压⽬录/Win32/Output/Debug和和解压⽬录/x64/Output/Debug和解压⽬录/x64/Output/Release,当然,这是我的结果,你的可能是Win64⽽不叫
接着在外部(磁盘随便哪)新建⼀个⽂件夹,命名为cryptopp或者⾃⼰起名。接着把刚刚解压得到的两个⽂件夹(每个⽂件夹下⼜有两个⼦⽂件夹)复制到新建的⽂件夹⾥。接着把原⼯程⽬录下的所有头⽂件.h均复制到新建⽂件夹,.cpp⽂件不⽤。复制完成后在新建的⽂件夹给分类下,⽐如头⽂件都放到新建的include⽂件夹中,依赖库都放到新建的lib⽂件夹中,如下:
四、使⽤
回到原来的⼯程,打开⼯程选项:
到配置属性->C/C++->代码⽣成,留⼼你现在的模式是Release还是Debug,好了,下⾯你需要记住它⾥⾯的运⾏库是什么。⽐
如Debug的运⾏库是/MTd,Release的则是/MT,还有相关的内容,因为⼀会⼉可能会⽤到。
下⾯开始正式使⽤
新建⼀个C++⼯程,应该都会吧,⼀个main.cpp,⼀个crypto_rsa.h,⼀个crypto_rsa.cpp。不考虑类对象。
先把这个⼯程的配置给调整了,还记得刚才的/MTd和MT吗?⽐较看看是不是不⼀样,调整到和原⼯程⼀样的运⾏库就⾏,包括设置页⾯下的Debug和Release模式的所有平台(别误以为是外⾯的那个模式)。
调整好了之后,在crypto_rsa.h写上依赖,依赖路径不记得的翻回去看。
上⾯就是导⼊依赖的写法了,每个模式对应不同的lib,下⾯是导⼊头⽂件,待会要⽤的。
好了,准备⼯作已经完成,看看还有哪⾥有问题回去⼀步步检查,应该说得够详细了。
五、RSA加密/解密
· ⾸先你得知道RSA是什么,这个知乎写得挺好的,简单明了:
·
或者更详细的:
· 其次你得学会在官⽹搜索内容:
· 搜到RSA:
⼀看傻眼了,这么⿁多英⽂(雅思托福满分就当我没说)。
我也是挖掘了很久,毕竟我英⽂功底也就⼀丢丢,所以直接带节奏算了。
看完上⾯的RSA介绍,你也应该知道,RSA是买⼀送⼀的⽅案,创建者⼀次产⽣公钥和密钥,将公钥交给接收者,密钥⾃⼰保存,那么,接收者⽤公钥加密密⽂,只有具有密钥的创建者才能解,期间内容是不可查看的,实现了加密传输;⽽创建者⽤密钥签名内容,内容在传输过程⼤家都能看,怎么看?当然是⽤公钥解签,(⽤公钥)解签后的内容和直接收到的内容传输⼀致,证明这个内容是可信的(从创建者发送过来的),实现了签名验证。
那么,我们就需要保存这两个重要东西:密钥和公钥,那就新建⼀个类型key,当然,你也可以不这么做,只是产⽣钥匙的时候才有⽤,你也可以选择直接向产⽣钥匙的函数传递引⽤来修改变量获得钥匙:
紧接着,我们需要有⾄少5个函数:产⽣钥匙、加密、解密、签名、解签。
这⾥我都是⽤图⽚不要介意,因为图⽚美观些,代码都放在底部。
其中,plain代表原⽂,cipher代表密⽂,signature代表签名,recovered代表恢复的内容,这些都是相对的,⽐如原⽂加密后得到密⽂,密⽂对于签名函数来说是原⽂,这些函数都是直接传引⽤,尾部就是传回值,返回值则是bool类型。
(⼀)⽣成密钥/公钥
参数:key_size,钥匙的长度,通常是2048以上。
来看函数内第⼀⾏代码,是产⽣⼀个伪随机数rng,具体产⽣过程不需要我们关⼼。
第⼆、三⾏是定义和初始化⼀个参数,这个参数根据伪随机数和指定长度产⽣⼀个包含n、p、q、d、
e的运算⽣成的结果参数。
第四、五⾏根据这个参数产⽣配对的公钥、密钥并返回这个集合,⾄此,钥匙产⽣好了。
(⼆)OAEP加密/解密
值得⼀提的是,Crypto++布置了许多加密⼿段,以及许多加密⽅案,OAEP是RSA加密的其中⼀种⽅案,另外还有PKCS1v15,推荐⽤OAEP。同样,签名也有两种,推荐PSS。
第⼀⾏是⽣成随机数,怎么⽣成不⽤管,只需要知道,传⼊参数有待加密原⽂、公钥、加密后的密⽂引⽤即可。
第⼆⾏是采⽤OAEP⽅案确定加密计算,第三⾏是加密并把密⽂放⼊cipher中。
下⾯是解密:
解密原理也是⼀样的,⽣成伪随机数rng,确定⽤私钥的加密⽅案OAEP,第三⾏是恢复内容到recovered。
测试代码:
可以⾃⾏试着,把⾥⾯的keys改成keys2会发现什么都没有,事实上抛出了异常。
测试结果:
六、RSA加密/解密的源码
main.cpp
#include "crypto_rsa.h"
#include <iostream>
怎么对文件夹加密int main()
{
key keys =generate_key();
key keys2 =generate_key();
const std::string plain ="HelloWorld";
std::string cipher, recovered;
if(rsa_encrypt(plain, keys.public_key, cipher))
{
if(rsa_decrypt(cipher, keys.private_key, recovered))
{
std::cout <<"Cipher: "<< std::endl;
for(const auto& x : cipher)
{
std::cout
<< std::setfill('0')
<< std::setw(2)
<< std::setiosflags(std::ios::uppercase)
<< std::hex <<static_cast<unsigned int>(static_cast<unsigned char>(x)) <<" ";
}
std::cout <<"Recovered message: "<< recovered << std::endl;
}
}
return0;
}
crypto_rsa.h
#ifndef CRYPTO_RSA_H
#define CRYPTO_RSA_H
#ifdef _DEBUG
#ifdef _WIN32
#pragma comment(lib, "D:\\cryptopp\\lib\\x86\\debug\\cryptlib.lib")
#else
#pragma comment(lib, "D:\\cryptopp\\lib\\x64\\debug\\cryptlib.lib")
#endif
#else
#ifdef _WIN32
#pragma comment(lib, "D:\\cryptopp\\lib\\x86\\release\\cryptlib.lib")
#else
#pragma comment(lib, "D:\\cryptopp\\lib\\x64\\release\\cryptlib.lib")
#endif
#endif
#include "D:/cryptopp/include/pssr.h"
#include "D:/cryptopp/include/rsa.h"
#include "D:/cryptopp/include/osrng.h"
struct key
{
CryptoPP::RSA::PrivateKey private_key;
CryptoPP::RSA::PublicKey public_key;
};
key generate_key(unsigned int key_size =2048);
bool rsa_encrypt(const std::string& plain, CryptoPP::RSA::PublicKey& public_key, std::string& cipher);
bool rsa_decrypt(const std::string& cipher, CryptoPP::RSA::PrivateKey& private_key, std::string& recovered); bool rsa_signature(const std::string& plain, CryptoPP::RSA::PrivateKey& private_key, std::string& signature); bool rsa_verify(const std::string& cipher_sign, CryptoPP::RSA::PublicKey& public_key, std::string& recovered); #endif
crypto_rsa.cpp
#include "crypto_rsa.h"
/**
* \brief ⽣成密钥对
* \param key_size
* \return
*/
key generate_key(const unsigned int key_size)
{
CryptoPP::AutoSeededRandomPool rng;
CryptoPP::InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, key_size);
key keys;
keys.private_key = params;
keys.public_key = params;
return keys;
}
/**
* \brief RSA加密(OAEP⽅案)
* \param plain 待加密原⽂
* \param public_key 公钥
* \param cipher 密⽂
* \return 加密成功或失败

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。