【问题标题】:How to easily apply Crypto++ hash functions?如何轻松应用 Crypto++ 哈希函数?
【发布时间】:2015-06-10 15:21:54
【问题描述】:

有人可以帮助我如何轻松使用 Crypto++ 库中的哈希函数吗? 我尝试将这些代码用于 SHA1 和 MD5。我在StringSink 的线上有很多错误。错误如下:

undefined reference to `CryptoPP::StringSinkTemplate::StringSinkTemplate(std::string&)'

感谢您的帮助。

 // SHA
CryptoPP::SHA1 sha1;
std::string source = "Hello";
std::string hash = "";
CryptoPP::StringSource(source, true, new CryptoPP::HashFilter(sha1, new CryptoPP::HexEncoder(new CryptoPP::StringSink(hash))));
std::cout << hash;

// MD5
CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "abcdefghijklmnopqrstuvwxyz";

hash.CalculateDigest( digest, (byte*) message.c_str(), message.length() );

CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();

std::cout << output << std::endl;

【问题讨论】:

    标签: c++ windows md5 sha1 crypto++


    【解决方案1】:

    StringSink 所在的行有很多错误

    StringSink 这一行对我来说看起来不错。您应该提供您遇到的确切错误。


    与 StringSink 相关的错误是:未定义对 `CryptoPP::StringSinkTemplate::StringSinkTemplate(std::string&)' 的引用

    根据您提供的其他信息,请参阅Building and linking test code for Crypto++


    如何轻松应用 Crypto++ 哈希函数?

    以下内容来自 ChannelSwitch 类的 Crypto++ wiki。既然要MD5,就需要#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1,然后#include &lt;cryptopp/md5.h&gt;。之后就可以在Weak::MD5找到MD5了。

    string message = "Now is the time for all good men to come to the aide of their country";
    if(argc == 2 && argv[1] != NULL)
        message = string(argv[1]);
    
    string s1, s2, s3, s4;
    SHA1 sha1; SHA224 sha224; SHA256 sha256; SHA512 sha512;
    
    HashFilter f1(sha1, new HexEncoder(new StringSink(s1)));
    HashFilter f2(sha224, new HexEncoder(new StringSink(s2)));
    HashFilter f3(sha256, new HexEncoder(new StringSink(s3)));
    HashFilter f4(sha512, new HexEncoder(new StringSink(s4)));
    
    ChannelSwitch cs;
    cs.AddDefaultRoute(f1);
    cs.AddDefaultRoute(f2);
    cs.AddDefaultRoute(f3);
    cs.AddDefaultRoute(f4);
    
    StringSource ss(message, true /*pumpAll*/, new Redirector(cs));
    
    cout << Message: " << message << endl;
    cout << "SHA-1: " << s1 << endl;
    cout << "SHA-224: " << s2 << endl;
    cout << "SHA-256: " << s3 << endl;
    cout << "SHA-512: " << s4 << endl;
    

    程序运行产生如下结果:

    $ ./cryptopp-test.exe password
    Message: password
    SHA-1: 5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
    SHA-224: D63DC919E201D7BC4C825630D2CF25FDC93D4B2F0D46706D29038D01
    SHA-256: 5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
    SHA-512: B109F3BBBC244EB82441917ED06D618B9008DD09B3BEFD1B5E07394C706A8BB9
             80B1D7785E5976EC049B46DF5F1326AF5A2EA6D103FD07C95385FFAB0CACBC86
    

    【讨论】:

    • StringSink 在线错误是:未定义对 `CryptoPP::StringSinkTemplate<:string>::StringSinkTemplate(std::string&)'的引用
    • 您是否必须删除这些HexEncoder*StringSink* 堆实例中的任何一个,或者执行那些其他类——您在示例代码中分配堆栈的那些,例如HashFilter – 管理他们的生命周期?或者是否有处理这些资源的 CryptoPP 约定? ......那些像我一样学习图书馆的人会从这些事情的一两个提示中受益
    • @fish2000 - 不,不需要删除它们,因为它们是指针。指针附加到的对象拥有该指针。参考是不同的,因为你管理它们。它是一种后天习得的味道 :) 请参阅README.txt 和关于对象所有权的部分。我们在 Pipelining 有一个关于它的 wiki 页面,但由于托管公司和上游提供商的问题,目前无法访问 VM。
    • @jww 太棒了,谢谢你的提示(我也被不可用的 wiki 挫败了)——但是,是的,CryptoPP 部分似乎在这些方面具有设计良好的 API;似乎不必在上面拍一堆unique_ptrs。整个cryptest.sh 套件仍在我这边运行,一旦完成,它看起来确实是一个令人愉快的库。
    • 小心 cryptest.sh,因为它运行 40 到 50 个测试(x2,因为它同时是 cryptest.exe vcryptest.exe tv all)。在第 5 代 i7 上,需要 2 1/2 到 3 小时。我定期在 ARM 上测试,运行需要几天时间。我最近添加了cryptest.sh fast 以跳过 valgrind 和基准测试。它是一个更快的烟雾测试,在大约一个小时内完成。我还发现两个克隆效果最好——一个可以工作,一个可以运行cryptest.sh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多