cryptopp 加密库使用

2020-08-11

cryptopp 是 c++ 加解密库,包含了大部分主流的加解密实现功能。详细可以查看官方文档。本章主要是写 demo,测试 cryptopp 的使用。


1. 安装

  • MacOS
1
brew install cryptopp
  • Linux
1
yum install cryptopp

2. demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <cryptopp/gzip.h>
#include <iostream>

#if defined(CRYPTOPP_NO_GLOBAL_BYTE)
using CryptoPP::byte;
#endif

bool gzip(const std::string& src, std::string& dst) {
    try {
        CryptoPP::Gzip zip;
        zip.Put((byte*)src.c_str(), src.size());
        zip.MessageEnd();

        CryptoPP::word64 avail = zip.MaxRetrievable();
        if (avail) {
            dst.resize(avail);
            zip.Get((byte*)&dst[0], dst.size());
        }
    } catch (CryptoPP::InvalidDataFormat& e) {
        std::cout << e.GetWhat() << std::endl;
        return false;
    }
    return true;
}

bool ungzip(const std::string& src, std::string& dst) {
    try {
        CryptoPP::Gunzip zip;
        zip.Put((byte*)src.c_str(), src.size());
        zip.MessageEnd();
        CryptoPP::word64 avail = zip.MaxRetrievable();
        if (avail) {
            dst.resize(avail);
            zip.Get((byte*)&dst[0], dst.size());
        }
    } catch (CryptoPP::InvalidDataFormat& e) {
        std::cout << e.GetWhat() << std::endl;
        return false;
    }
    return (true);
}

int main(int argc, char** argv) {
    // gzip
    std::string src("hello world!"), dst;
    if (gzip(src, dst)) {
        std::cout << "gzip: " << dst << std::endl;
    } else {
        std::cout << "gzip failed!" << std::endl;
    }

    // ungizp
    if (ungzip(dst, src)) {
        std::cout << "ungzip: " << src << std::endl;
    } else {
        std::cout << "ungzip failed!" << std::endl;
    }

    return 0;
}
  • demo 运行结果。
1
2
3
4
# g++ -std='c++11' test_cryptopp.cpp -lcryptopp -o encry && ./encry
gzip: �H���W(�/�IQm´

ungzip: hello world!

3. 参考