1. 程式人生 > >Vc6.0下配置 Crypto++ ------用Crypto Library 實現簡單的RSA加密

Vc6.0下配置 Crypto++ ------用Crypto Library 實現簡單的RSA加密

首先建立Crypto__test 工程。


        在已編譯好的Cryptopp561中找到Debug資料夾 下的cryptlib.lib 將其改名為cryptlibd.lib後放到上級目錄中。在Release資料夾下找到cryptlib.lib 將其放到上級目錄中(不改名)。目的是為以後引用方便。


     在 工具——選項 ——目錄中 選擇 Include--files 匯入CRYPTOPP561 (方便以後程式中引用) 接著選擇Library files 匯入CRYPTOPP561 (這就是問什麼剛才需要把兩個庫檔案放在上級目錄的原因----方便引用)



在工程———設定 ——除錯 下  分類中選擇 Code Generation  然後選擇Multithreaded (多執行緒) 此步非常重要,若不設定將會出現

2005錯誤


將如下程式碼放入  StdAfx.h 檔案中 (主要是編譯時用到得標頭檔案和類庫)

#include <iostream>

// Crypto++ Library
#ifdef _DEBUG
#  pragma comment( lib, "cryptlibd" )
#else
#  pragma comment( lib, "cryptlib" )
#endif


 最後在Crypto__test.cpp 中貼入如下原始碼:

// Crypto__test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "rsa.h"
#include "osrng.h"
#include "integer.h"
#include "sha.h"
#include "hex.h"
#include "filters.h"

int main(int argc, char* argv[])
{
    ///////////////////////////////////////
    // Quote of the Day
    //   Stephen Hawkins
    std::string message( "I think computer viruses should count as life. I think it\n" \
        " says something about human nature that the only form of\n" \
        " life we have created so far is purely destructive. We've\n" \
        " created life in our own image." );

    ///////////////////////////////////////
    // Pseudo Random Number Generator
    CryptoPP::AutoSeededRandomPool rng;

    ///////////////////////////////////////
    // Key Generation
    CryptoPP::InvertibleRSAFunction keys;
    keys.GenerateRandomWithKeySize( rng, 384 );

    ///////////////////////////////////////
    // Generated Parameters
    CryptoPP::Integer n = keys.GetModulus();
    CryptoPP::Integer p = keys.GetPrime1();
    CryptoPP::Integer q = keys.GetPrime2();
    CryptoPP::Integer d = keys.GetPrivateExponent();
    CryptoPP::Integer e = keys.GetPublicExponent();

    ///////////////////////////////////////
    // Dump
    std::cout << "RSA Parameters:" << std::endl;
    std::cout << " n: " << n << std::endl;
    std::cout << " p: " << p << std::endl;
    std::cout << " q: " << q << std::endl;
    std::cout << " d: " << d << std::endl;
    std::cout << " e: " << e << std::endl;
    std::cout << std::endl;

    ///////////////////////////////////////
    // Signature
    CryptoPP::RSASS<
        CryptoPP::PKCS1v15, CryptoPP::SHA
    >::Signer signer( keys );

    ///////////////////////////////////////
    // Dump
    std::cout << "Message:" << std::endl;
    std::cout << " " << message << std::endl;
    std::cout << std::endl;

    // Set up for SignMessage()
    byte* signature = new byte[ signer.MaxSignatureLength() ];
    if( NULL == signature ) { return -1; }

    // Sign...
    size_t length = signer.SignMessage( rng, (const byte*) message.c_str(),
        message.length(), signature );

    ///////////////////////////////////////
    // Signature Hex Encoding
    std::string encoded;
    CryptoPP::HexEncoder encoder( new CryptoPP::StringSink( encoded ),
        true /* Uppercase */, 2 /* Grouping */, ":" /* Separator */ );
    encoder.Put( signature, length );
    encoder.MessageEnd();

    ///////////////////////////////////////
    // Dump
    std::cout << "Signature:" << std::endl;
    std::cout << " " << encoded << std::endl;
    std::cout << std::endl;

    ///////////////////////////////////////
    // Verification
    CryptoPP::RSASS<
        CryptoPP::PKCS1v15, CryptoPP::SHA
    >::Verifier verifier( signer );

    bool result = verifier.VerifyMessage( (const byte*)message.c_str(),
        message.length(), signature, length );

    ///////////////////////////////////////
    // Verify Result
    if( true == result )
    {
        std::cout << "Message Verified" << std::endl;
    }
    else
    {
        std::cout << "Message Verification Failed" << std::endl;
    }

    ///////////////////////////////////////
    // Cleanup
    if( NULL != signature ) { delete[] signature; }

    return 0;
}

執行結果如下:


到此有關crypto++環境搭建工作基本上已經完成。若遇到此文中沒有提及的問題時可百度查閱相關資料。

本文在寫作的過程中參考了CodeProject 上Jeffrey Walton(此人是Crypto++大牛) 的相關文章,如有需要可點選 此處檢視。

相關推薦

Vc6.0配置 Crypto++ ------Crypto Library 實現簡單RSA加密

首先建立Crypto__test 工程。         在已編譯好的Cryptopp561中找到Debug資料夾 下的cryptlib.lib 將其改名為cryptlibd.lib後放到上級目錄中。在Release資料夾下找到cryptlib.lib 將其放到上級目

spring boot 實現簡單AES加密演算法

這個寫了好幾個月了,拿出來記一下。 業務需求:資料庫中的使用者名稱密碼明文儲存在配置檔案中,不是十分安全。所以將資料庫中的使用者名稱密碼使用AES對稱加密放入配置檔案中,達到加密效果。同時也不想使用tomcat等中介軟體等太繁重,就使用了spring boot

【大數據系列】在hadoop2.8.0配置SecondaryNameNode

hadoop .cn color dfs repl images replicat style 節點 修改namenode上的hdfs-site.xml configuration> <property> <name>dfs.r

VC6.0++ 的調試

方法 斷點調試 大一學生 cnblogs 程序出錯 光標位置 調試 過程 進行 晚上就要給大一學生介紹VC6.0++裏的調試方法,所以提前來熟悉下。 VC下的調試有3個入口 如圖所介紹,分別是 按F5 、 F11 、 Ctrl+F10 進入。 在進入到調試模式後要熟悉以下

【caffe】Windows10+Cuda9.0+Cudnn7.0配置GPU版caffe

第一步:下載所需軟體 1、下載CUDA9.0,也是目前的最新版本。 2、下載CUDNN V7.0。 3、下載Caffe。  第二步:安裝和配置 參考網上的大多數教程,對軟體進行安裝配置。 1、安裝CUDA9.0,安裝過程很簡單。 2、CUDA9.0安裝完

VC6.0使用DebugBreak

在開發過程中,可能存在一些老專案還是使用VC6.0開發。如果一個dll崩掉了,我們可以通過編譯相對應的Debug版本,並使用DebugBreak()設定斷點來。重操作,單步除錯來定位錯誤。 1. 安裝VC++6.0之後,檢查是否含有Sp6的補丁包,若沒有需要補充安裝。

vc6.0的GDI+設定及精彩例項

1.下載(GDI+ for VC6.0 SDK)GDIPlus檔案將其中的Includes和Lib中的檔案拷到vc目錄下的Includes和Lib資料夾中.dll 檔案放到system32中,如果已經有就不用再替換 2.在你將要使用GDI+的工程中,完成初始化工作: 在S

VC6.0配置使用Sqlite3

2.進入VC安裝檔案目錄,(綠色版的VC沒有LIB.EXE,我是重新安裝的)執行以下命令: 系統報錯說我缺少mspdb60.dll這個動態連結庫。 (在你自己的系統中或者網上找一個這個檔案放到哪個目錄下就可以了)也就是將這兩個檔案放到.LIB.EXE檔案所在的目錄B

VC6.0建立多執行緒的方法和注意的事項

#include<stdio.h> #include <process.h> #include <stdio.h> #include <windows.h> DWORD _stdcall ThreadProc(LPVOID l

VC6.0更改字型(win64) oracle解鎖使用者

這周沒法自己寫了轉一篇吧 微軟王(7+1)蛋…… 在VC6.0下更改字型,我們一般通過選單-Tools-Options-Format來更改但在win7 64位系統下這一選項下的字型和字型顏色有時是空的無法選擇,這裡我們可以通過登錄檔來更改。Win+R輸入"regedi

vc6.0資原始檔/rc檔案的使用

1.新建一個資原始檔 選單欄 File new -> File 下 Resource Script 然後儲存; 2.編譯這個新建的rc檔案, 生成 resource.h 檔案 ; 3.選中專案,Add Files to Project 然後 在工程/專案檔案下找到 r

在android studio配置gradlendk-build和ndk-gbd編譯除錯JNI

因為要在舊版android在做一些工作。所以做用到了它。目標平臺是:android api 10和armv6. 開發環境是:AS

Windows平臺VC++ 6.0 的網絡編程學習 - 簡單的測試winsock.h頭文件

有關 tle 數據結構 inf app unsigned failed 錯誤處理 tcp 最近學習數據結構和算法學得有點累了(貌似也沒那麽累...)...找了本網絡編程翻了翻當做打一個小基礎吧,打算一邊繼續學習數據結構一邊也看看網絡編程相關的...

Linux環境Shell調MySQL並實現定時任務

usr .sql 操作 default char star ted 空格 rontab 對於一些周期性事務,我們可以在Linux下,使用shell腳本調用mysql數據庫存儲過程,並設置定時任務。 本來是要mysql數據庫中創建事件任務來,定時執行存儲過程,做數據傳輸的。

Android4.0的Calendar、events、reminder簡單Demo

上週花了不到一個周研究了一下android中的Calendar這個東西,下面把我的收穫與大家分享一下。 我的研究是從閱讀官方文件開始的。官方文件上的開頭部分涉及到了一個ContentProvider和ContentResolver的東西。這個概念在android開發中很重要

Ubuntu配置FreeRadius+MySQL+xl2tpd,實現L2TP由FreeRadius認證連線並由MySQL管理使用者

大部分情況下,pptp協議的VPN服務已經不被支援了(例如iOS下不支援pptp),所以我搭建的VPN用的是L2TP協議的。 作業系統版本:Ubuntu 14.04 LTS 執行環境:LAMP1.5 一、前期工作 1.安裝LAMP搭建Web容器服務 wget -c

在VS2015配置websocket++,並用C++搭建一個簡單的客戶端

簡介 最近在做一個專案,需要在C++中通過WebSocket和伺服器進行通訊,但我們在C++中並不能直接使用WebSocket,於是上網搜尋後發現websocket++這個庫很合適。 Websocket是基於HTTP協議的,或者說借用了HTTP的協議來完成一

Visual C# 2015調SnmpSharpNet庫實現簡單的SNMP元素查詢

msd unity because 研發 erro 發送 efi rar 如何 一開始調研發現有幾個SNMP的庫, 一個是net-SNMP,這個好像是linux用的多 一個是微軟自己的WinSNMP,這個沒有例子,不太好操作 一個是SnmpSharpNet,這個有些例

C語言實現簡單 三子棋(井字棋)小遊戲

函式頭 放在標頭檔案裡 #ifndef __GAME_H__ #define __GAME_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #inc

ArrayList實現簡單學生管理系統

package ArrayTest; /* * 用arrayList<E>去實現學生管理系統 */ import java.util.ArrayList; import java.util.Scanner; public class StudentSyst