1. 程式人生 > >Crypto++庫在VS 2008中的使用——RSA加解密

Crypto++庫在VS 2008中的使用——RSA加解密

        原始碼:下載 

一.   下載Crypto++ Library

二.   建立自己使用的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 *)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) already defined in msvcprtd.lib(MSVCP80D.dll)

說在msvcprtd.lib和MSVCRTD.lib中已經定義過。

相關推薦

使用Crypto++5.5.2完成RSA解密,真正的把公鑰放在字串內,而不是放在檔案內

忙活了一週,基本完成了Crypto++庫中關於RSA加解密的API封裝!這一週裡,查了很多Crypto++的相關資料,感覺這方面的內容乏善可陳,或者太簡單,或者太籠統!本文希望能給使用Crypto++的朋友帶來一些幫助,主要還是原始碼了,實在沒有時間碼文字!在測試過程中,感覺Crypto++還是非常高效的,期

javaRSA解密的實現

原文:https://blog.csdn.net/draven1122/article/details/55212195關於加密資料長度和解密資料長度大家可以看一下我前一篇文章內的介紹:publicstaticvoid main(String[] args) throws E

Crypto++VS 2008的使用——RSA解密

        原始碼:下載  一.   下載Crypto++ Library 二.   建立自己使用的Crypto++ Library 由於從官方網下載的Crypto++庫是開源的,只有原始檔和幾個可以生成lib、dll的工程,以及一個使用的例子工程,因此希望生

Crypto++VS 2005的使用——RSA解密

        原始碼:下載  一.   下載Crypto++ Library 二.   建立自己使用的Crypto++ Library 由於從官方網下載的Crypto++庫是開源的,只有原始檔和幾個可以生成lib、dll的工程,以及一個使用的例子工程,因此希望生

Vue項目RSA解密

用戶輸入 dft eba NPU str 文件 動態生成 console ted 前後端使用rsa加密: 一般是客戶端初始化時訪問登錄服務時,服務端面動態生成一對RSA對,公鑰傳給客戶端,客戶端拿到後,用戶輸入密碼後,點登錄時用公鑰加密返回給服務端,服務端用私鑰解就行了

RSA解密 私鑰加密公鑰解密公解 && C++ 調用openssl 的代碼實例

密鑰 code www. res result 方法 urn .cn read 前提:秘鑰長度=1024 ==============================================     對一片(117字節)明文加密 私加 ==============

關於JAVARSA簽解籤,私鑰加密公鑰解密和公鑰加密私鑰解密程式碼詳解

在專案中遇到的問題百度了許久總結出來的 私鑰加密公鑰解密和公鑰加密私鑰解密。 一般為了安全採用的是私鑰加密,公鑰解密(公鑰可以用Base64轉換後公開) package com.paic.ebank.creditcard.common.util; import java.s

基於cyptopprsa解密詳解

編譯Cryptopp 編譯過程沒有什麼特別,需要注意的是,如果使用dll版本的庫,只包含IPS認證的演算法,而編譯靜態連結庫則包含全部演算法,具體參考[1,2]。 cryptopp - This builds the DLL. Please no

java rsa解密算法的實現

binary 0x03 object sat ear exc triple turn create RSAUtils:RSA加解密的實現 package com.rsa.test; import java.io.ByteArrayOutputStream; import

PHP 基礎篇 - PHP DES 解密詳解

tor 數據加密 解密 ans eat mark encrypted hex 基礎 一、簡介 DES 是對稱性加密裏面常見一種,全稱為 Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法。密鑰長度是64位(bit),超過位數密鑰被忽

與非java語言使用RSA解密遇到的問題:algid parse error, not a sequence

write ltr 結果 cep exp result 命令 pat ror 遇到的問題 在一個與Ruby語言對接的項目中,決定使用RSA算法來作為數據傳輸的加密與簽名算法。但是,在使用Ruby生成後給我的私鑰時,卻發生了異常:IOException: algid pars

python3 rsa 解密 支持長字符串

keys max none common clas pan length 加密 new # rsa 加密 def rsa_encrypt_bytes(bytes_str, n, e): if not isinstance(bytes_str, bytes):

MD5+DES在C#.NET與Java/Android解密使用

main 模式 NPU ++ 代碼 加密、解密 ets 推薦 lock 一、背景後臺(C#.NET)使用一個MD5+DES的加解密算法,查了下,很多網友都使用了這個算法。在Android裏,也需要這個算法,如何把這個加解密算法切換成Java版,成了難題。畢竟好久沒涉及到這一

java rsa解密

簡單實用java實現rsa加解密,java內部使用pkcs8格式私鑰,openssl預設為pkcs1私鑰,注意格式 maven專案 //pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="

python3base64解密

import base64 payload = "select * from workbasic" b =base64.b64encode(payload.encode('utf-8')).decode("utf-8") print(b) # 'c2VsZWN0ICogZnJvbSB3b3JrY

PHP常用解密方式

PHP中使用OpenSSL生成RSA公鑰私鑰及進行加密解密示例(非對稱加密) php服務端與客戶端互動、提供開放api時,通常需要對敏感的部分api資料傳輸進行資料加密,這時候rsa非對稱加密就能派上用處了,下面通過一個例子來說明如何用php來實現資料的加密解密 一、公鑰加密 假設一下,我找了兩個數字,

使用python實現RSA解密演算法(包含讀取檔案操作),檔案內容為16進位制字串,同時實現對學號姓名的加密——(SCU應用密碼學實驗)

#-*- coding:UTF-8 -*- ''' time: 2018-5-30 content:RSA python 3.6 mac os ''' from random import randint import random im

PHP RSA解密示例

1.生成金鑰和公鑰  開始前需要準備openssl環境  linux 需要安裝openssl工具包,傳送門http://www.openssl.org/source/  window 下需要安裝openssl的程式,傳送門http://slproweb.com/prod

RSA解密工具類

參考: https://github.com/sjyuan-cc/cc.sjyuan.commons/blob/master/src/main/java/cc/sjyuan/commons/util/encryptor/RSAUtils.java package com.tinfinite.co

關於rsa解密的內容超長的問題

轉自:https://blog.csdn.net/taoxin52/article/details/53782470 一. 現象:      有一段老程式碼用來加密的,但是在使用key A的時候,丟擲了異常:javax.crypto.Illega