鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站安全 > 加密解密 > >

Vc6.0下配置 Crypto++ ------用Crypto Library 实现简单的RSA加

来源:互联网 作者:佚名 时间:2015-09-08 11:06
首先创建Crypto__test 工程。 在已编译好的Cryptopp561中找到Debug文件夹 下的cryptlib.lib 将其改名为cryptlibd.lib后放到上级目录中。在Release文件夹下找到cryptlib.lib 将其放到上级目录中(不改名)。目的是为以后引用方便。 在 工具——选项 ——目录

       首先创建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++大牛) 的相关文章,如有需要可点击 此处查看。

网友评论
<