`
cuijiemin
  • 浏览: 263868 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Crypto++库在VS 2005中的使用——RSA加解密

阅读更多
Crypto++库在VS 2005中的使用——RSA加解密

源代码:下载
一. 下载Crypto++ Library
Crypto++ Library的官方网:http://www.cryptopp.com/
二. 建立自己使用的Crypto++ Library
由于从官方网下载的Crypto++库是开源的,只有源文件和几个可以生成lib、dll的工程,以及一个使用的例子工程,因此希望生成自己建的工程能使用的SDK。
1. 编译链接生成cryptlib.lib
打开cryptest.sln,分别在Debug模式和Release模式下编译链接cryptlib工程,成功后会在cryptopp54\Win32\output\debug和cryptopp54\Win32\output\release下生成cryptlib.lib文件。作者当时用的是Crypto++ 5.4版本。
Build时方法是,右击Solution Explorer中的cryptlib工程,单击build。第一次时它会报错说“d:\cryptopp54\adler32.cpp(3) : fatal error C1033: cannot open program database 'd:\cryptopp54\win32\cryptlib\debug\vc80.idb'”,没关系,按这样再build一次,就可以build成功了。
2. 建立Crypto++ SDK
在C:\Program Files\中新建文件夹,取名“CryptoPP”,里面新建文件夹“include”、“lib”,在“lib”中新建文件夹“debug”、“release”。将Crypto++库中的所有头文件复制到“include”文件夹中,再将上面生成的两个cryptlib.lib分别复制到“debug”和“release”中。
三. RSA加解密
1.
在VS 2005中新建Win32 Console Application工程,建立空的工程。完成后新建文件main.cpp,里面源码如下:
#include "randpool.h"
#include "rsa.h"
#include "hex.h"
#include "files.h"
#include <iostream>
using namespace std;
using namespace CryptoPP;
#pragma comment(lib, "cryptlib.lib")
//------------------------
// 函数声明
//------------------------
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);
string RSAEncryptString(const char *pubFilename, const char *seed, const char *message);
string RSADecryptString(const char *privFilename, const char *ciphertext);
RandomPool & GlobalRNG();
//------------------------
// 主程序
//------------------------
void main()
{
char priKey[128] = {0};
char pubKey[128] = {0};
char seed[1024]= {0};
// 生成 RSA 密钥对
strcpy(priKey, "pri");// 生成的私钥文件
strcpy(pubKey, "pub");// 生成的公钥文件
strcpy(seed, "seed");
GenerateRSAKey(1024, priKey, pubKey, seed);
// RSA 加解密
char message[1024] = {0};
cout<<"Origin Text:\t"<<"Hello World!"<<endl<<endl;
strcpy(message, "Hello World!");
string encryptedText = RSAEncryptString(pubKey, seed, message);// RSA 加密
cout<<"Encrypted Text:\t"<<encryptedText<<endl<<endl;
string decryptedText = RSADecryptString(priKey, encryptedText.c_str());// RSA 解密
cout<<"Decrypted Text:\t"<<decryptedText<<endl<<endl;
}
//------------------------
// 生成RSA密钥对
//------------------------
void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed)
{
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);
HexEncoder privFile(new FileSink(privFilename));
priv.DEREncode(privFile);
privFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor pub(priv);
HexEncoder pubFile(new FileSink(pubFilename));
pub.DEREncode(pubFile);
pubFile.MessageEnd();
}
//------------------------
// RSA加密
//------------------------
string RSAEncryptString(const char *pubFilename, const char *seed, const char *message)
{
FileSource pubFile(pubFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Encryptor pub(pubFile);
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
string result;
StringSource(message, true, new PK_EncryptorFilter(randPool, pub, new HexEncoder(new StringSink(result))));
return result;
}
//------------------------
// RSA解密
//------------------------
string RSADecryptString(const char *privFilename, const char *ciphertext)
{
FileSource privFile(privFilename, true, new HexDecoder);
RSAES_OAEP_SHA_Decryptor priv(privFile);
string result;
StringSource(ciphertext, true, new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))));
return result;
}
//------------------------
// 定义全局的随机数池
//------------------------
RandomPool & GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
2. 设置工程属性
选择工程属性(Alt + F7):
(1)“Configuration Properties”→“C/C++” →“General”,右边的“Additional Include Directories”设置为上面建好的Crypto++ SDK的Include文件夹,“C:\Program Files\CyptoPP\include”;
(2) “Configuration Properties”→“Linker” →“General”,右边的“Additional Library Directories”设置为上面建好的Crypto++ SDK的Lib\Debug文件夹,“C:\Program Files\CyptoPP\lib\debug”(Release模式下对应着Release文件夹);
(3) “Configuration Properties”→“C/C++” →“Code Generation”,右边的“Runtime Library”设置为“Multi-threaded Debug (/MTd)”(Release模式下对应着“Multi-threaded (/MT)”)
3. 运行程序(Ctrl + F5)
正常运行的输出结果为:
Origin Text: Hello World!
Encrypted Text: 79C72A482482EF45111F961772456310792AB735ECF72329ECB26292D2B26374
824E0E35D24A63CB03B867DD2C70B001FD4B2B33FBC984BD229A5226F284B889901817976A680322
9E8351372C5E28E8BEBA2A94E7CF61A8A162F0BA2F3E0C35D26842D92EC4866D25E6BF878743E481
84D9F6FF9BA690F953568D017C02D540
Decrypted Text: Hello World!
如果上面的第(3)步没有设置则会出现以下链接错误:
cryptlib.lib(randpool.obj) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in msvcprtd.lib(MSVCP80D.dll)
说在msvcprtd.lib和MSVCRTD.lib中已经定义过。
分享到:
评论

相关推荐

    mfc 对话框 Crypto++库在VS 2013中的使用——RSA加解密实例

    (1.rsa本身并不适用于大量内容的加解密。2.程序在可执行目录下生成有私钥(pri)、及公钥(pub)。在另一个客户端解密时,可先读取私钥(pri),存入char数组中,即可跨程序解密了。) csdn博客链接:...

    RSA加解密Java&Android;解决长度限制亲测可用idea

    在Java中,`java.security`和`javax.crypto`包提供了必要的接口和类来实现RSA加解密。例如,`KeyPairGenerator`用于生成公钥和私钥对,`Cipher`用于进行加解密操作。 在描述中提到的"解决长度限制",这是因为在RSA...

    AES+RSA加密解密(js和java互通)

    在这个项目中,我们关注的是"AES+RSA加密解密",这是两种广泛使用的加密算法,适用于JavaScript和Java环境中的前后端数据交换。下面将详细介绍这两个加密算法以及如何实现它们的互通。 **AES(Advanced Encryption ...

    C#RSA加密与JAVA解密,实现相互通信

    RSA是一种非对称加密算法,它使用一对密钥——公钥和私钥,公钥用于加密,私钥用于解密,确保了即使数据在网络中被截获,也无法被未经授权的第三方解密。 首先,我们来理解RSA的核心原理。RSA算法基于大数因子分解...

    我的程序————RSA算法

    RSA算法是一种非对称加密算法,它在信息安全领域扮演着重要的角色,特别是在数据加密和数字签名方面。...虽然描述中提到的程序可能在界面方面并不精美,但其核心功能——RSA算法的实现,是信息安全领域的重要实践。

    crypto50加密算法库

    在该库中,我们还能看到如TRUNHASH.H、SERPENTV.DAT、HRTIMER.H、LUBYRACK.H等头文件和数据文件,它们分别对应不同的功能。例如,TRUNHASH.H可能涉及哈希函数,用于生成消息的固定长度摘要;SERPENTV.DAT可能是...

    CryptoppTestC vs2010 加密解密代码

    在这个项目中,CryptoppTestC利用了Crypto++库来创建具有用户界面的应用程序,使得开发者和使用者能够直观地体验加密和解密的过程。 首先,让我们来看看DES(Data Encryption Standard)算法。DES是一种古老的对称...

    javascript实现rsa加解密

    JavaScript实现RSA加解密主要涉及的是公钥加密算法的基础理论,以及如何在Web环境中使用JavaScript进行实际操作。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它的特点是加密...

    Java_DES和RSA加解密

    总结来说,DES和RSA在Java中实现加解密的过程主要包括: - 生成密钥:DES使用`KeyGenerator`,RSA使用`KeyPairGenerator`。 - 初始化密码器:`Cipher.getInstance()`,并指定加密算法。 - 加密:`cp.init(Cipher....

    rsa aes java 混合加密解密

    在给定的标题和描述中,我们关注的是两种主要的加密算法——RSA和AES,以及它们在Java环境中的混合使用。RSA是一种非对称加密算法,而AES是一种对称加密算法。这两种加密方式各有优势,混合使用可以兼顾效率和安全性...

    crypto-js加密解密资源包(含所有前台加密的js代码)

    在IT行业中,加密和解密是确保数据安全的重要手段,特别是在前端开发中,为了保护用户敏感信息,如密码、个人信息等,通常会采用加密技术。本资源包“crypto-js加密解密资源包(含所有前台加密的js代码)”正是为了...

    东南大学密码学实验——EIGamal加解密算法

    在本次东南大学的密码学课程作业中,学生将通过编写C++程序实现EIGamal的加解密过程,并撰写详细的实验报告,以理解其工作原理。 **一、EIGamal加密算法基础** EIGamal算法是由 Taher ElGamal 在1985年提出的一种...

    nginxRSA加密,java解密例子

    总之,通过在Nginx中使用RSA加密并与Java后端进行解密配合,我们可以创建一个安全的通信链路,防止敏感信息在传输过程中被窃取。这种方法广泛应用于Web服务、API调用等场景,确保了数据的隐私和安全性。

    基于DES和RSA混合加密的通信系统(C++)

    这使得RSA在安全通信中非常有用,因为它允许一方(发送者)公开其公钥而无需担心数据被他人解密,只有接收者持有私钥,能完成解密过程。 在这个C++实现的通信系统中,DES可能用于数据的快速加密和解密,因为对称...

    RSA加密算法——信息安全

    RSA加密算法是公钥密码学领域中的一个里程碑式发明,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是基于大整数因子分解的困难性,是现代密码学的基础之一,广泛应用于数据加密、数字...

    M2crypto-0.27.0.tar.gz

    标题中的"M2crypto-0.27.0.tar.gz"指示了我们正在讨论的是M2Crypto库的一个特定版本——0.27.0,它被封装在一个tar.gz格式的压缩包中。这种格式通常是Unix/Linux系统中常见的归档和压缩方式,方便开发者下载和分发...

    Crypto——哈希函数和各种加密算法

    在JavaScript中,你可以使用`crypto`内置模块来创建哈希,例如: ```javascript const crypto = require('crypto'); const data = 'Hello, World!'; const hash = crypto.createHash('sha256'); hash.update(data);...

    华为-华为od题库练习题之字符串加解密.zip

    8. **编程实现**:在实际编程中,掌握Python的`hashlib`、`cryptography`库,Java的`java.security`包,或者C++的`Crypto++`等加密库的使用,能够高效实现加解密功能。 9. **加密协议**:如SSL/TLS(Secure Socket ...

    js代码-nodejs使用crypto加解密文件

    在JavaScript的世界里,Node.js提供了一个强大的加密模块——crypto,用于执行各种加密和解密操作。这个模块基于OpenSSL库,...通过理解和实践这些代码,你可以熟练掌握Node.js中使用crypto模块进行文件加解密的方法。

    jsp毕业设计——基于JAVA的RSA文件加密软件的设计与实现(源代码+论文).zip

    在Java中,可以使用Java Cryptography Extension (JCE) 来实现RSA加密。JCE提供了`java.security.KeyPairGenerator`类来生成RSA密钥对,`java.security.Signature`类用于签名和验证,以及`javax.crypto.Cipher`类...

Global site tag (gtag.js) - Google Analytics