从字符串Crypto ++

时间:2017-08-05 14:10:50

标签: c++ rsa crypto++

我想直接从字符串变量导入RSA密钥,以便与Crypto ++库一起使用。

代码如下所示: 这是我想要做的一个例子,而不是一个有效的代码。

std::string publickey_str =
    "-----BEGIN PUBLIC KEY-----"
    "gm6mZA1NTZQJVUk9AGDb6NRngzRlRAgXBTWAispwlqsuHFoCrv02xPm1uxkLyfUq"
    "LoA4/EQJ25okjmGkrjgak+XmQIPKmAg94gWAtvRIrLZNmCj/aPeuikmCPXkKtg2b"
    "pdB6xzHY0ftGu0l6Vb8zttg7Wfo1kJowjoqCRwo9ex/IKwPXxE3UsugshcZOGdqT"
    "6E3B/Vw+JoerL/LfeOU2OYcSFEXsWqjzkrGzEVuKzRnve5RlXyY0gShP33f+hDnC"
    "F+Uu2tFfFgxRkdQPk7AKm4MCAwEAAQ=="
    "-----END PUBLIC KEY-----";

RSA::PublicKey publicKey;
publicKey.load(publickey_str);

在Crypto ++ wiki中,我只找到如何从/向文件导入/导出密钥(.der,.pem)。你知道我怎么能用字符串做同样的事情?

编辑:我道歉,我忘了告诉我缩短了这个例子的RSA公钥。

2 个答案:

答案 0 :(得分:2)

  

我只找到如何从/向文件导入/导出密钥(.der,.pem)。你知道我怎么能用字符串做同样的事情?

在Crypto ++中,您可以为任何其他来源交换一个来源。您可以更改FileSourceNetworkSourceStringSource等的ArraySource

这同样适用于过滤器。 HexEncoderBase64EncoderHexDecoderBase64Decoder以及所有可互换的过滤器。它不仅限于编码器,您也可以交换加密过滤器,签名过滤器或验证过滤器。它们可以交换进出,因为它们都实现了BufferedTransformation接口。

同样适用于水槽。您可以更改FileSinkNetworkSinkStringSink等的ArraySink

您要显示的密钥是PEM编码密钥。要在PEM中进行编码和解码,您需要PEM Pack。它不属于图书馆本身,因此可能会从您的图书馆副本中丢失。相反,PEM Pack是社区维护的附加组件,您必须下载并构建它。

要使用PEM包,您需要从源重建库。设置:

$ cd cryptopp
$ wget https://www.cryptopp.com/w/images/5/5a/Pem-pack.zip
--2017-08-05 16:30:26--  https://www.cryptopp.com/w/images/5/5a/Pem-pack.zip
Resolving www.cryptopp.com (www.cryptopp.com)... 144.217.231.241
Connecting to www.cryptopp.com (www.cryptopp.com)|144.217.231.241|:443...
...
2017-08-05 16:30:26 (862 KB/s) - ‘Pem-pack.zip’ saved [20769/20769]

$ unzip -aoq Pem-pack.zip
$ ls pem*
pem-com.cpp  pem-create-keys.sh  pem-rd.cpp    pem-verify-keys.sh
pem-com.h    pem.h               pem-test.cxx  pem-wr.cpp

然后,像往常一样:

$ make distclean
...

$ make -j 9
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c cryptlib.cpp
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c cpu.cpp
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c integer.cpp
...
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c pem-com.cpp
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c pem-rd.cpp
g++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c pem-wr.cpp
...
ar r libcryptopp.a cryptlib.o cpu.o integer.o 3way.o ... zdeflate.o zinflate.o zlib.o

注意:我需要修复auto_ptr警告。我今天晚些时候会谈到它。这已得到修复。维基可以获得PEM Pack的新版本。

现在,您有PEM支持:

$ nm libcryptopp.a | grep PEM | grep ' T ' | c++filt
00000000000000a0 T CryptoPP::PEM_WriteLine(CryptoPP::BufferedTransformation&, CryptoPP::SecBlock<unsigned char, CryptoPP::AllocatorWithCleanup<unsigned char, false> > const&)
00000000000000f0 T CryptoPP::PEM_WriteLine(CryptoPP::BufferedTransformation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
0000000000000140 T CryptoPP::PEM_Base64Decode(CryptoPP::BufferedTransformation&, CryptoPP::BufferedTransformation&)
00000000000004e0 T CryptoPP::PEM_Base64Encode(CryptoPP::BufferedTransformation&, CryptoPP::BufferedTransformation&)
...

这是代码。

$ cat pem-test.cxx
#include <string>
#include <iostream>

#include "integer.h"
#include "rsa.h"
#include "pem.h"
using namespace CryptoPP;

int main(int argc, char* argv[])
{
    const std::string publickey_str =
        "-----BEGIN PUBLIC KEY-----\n"
        "gm6mZA1NTZQJVUk9AGDb6NRngzRlRAgXBTWAispwlqsuHFoCrv02xPm1uxkLyfUq\n"
        "LoA4/EQJ25okjmGkrjgak+XmQIPKmAg94gWAtvRIrLZNmCj/aPeuikmCPXkKtg2b\n"
        "pdB6xzHY0ftGu0l6Vb8zttg7Wfo1kJowjoqCRwo9ex/IKwPXxE3UsugshcZOGdqT\n"
        "6E3B/Vw+JoerL/LfeOU2OYcSFEXsWqjzkrGzEVuKzRnve5RlXyY0gShP33f+hDnC\n"
        "F+Uu2tFfFgxRkdQPk7AKm4MCAwEAAQ==\n"
        "-----END PUBLIC KEY-----\n";

    RSA::PublicKey publicKey;

    try
    {
        StringSource source(publickey_str, true);
        PEM_Load(source, publicKey);
    }
    catch(const Exception& ex)
    {
        std::cerr << ex.what() << std::endl;
        return 1;
    }

    const Integer& e = publicKey.GetPublicExponent();
    std:: cout << e << std::endl;

    const Integer& n = publicKey.GetModulus();
    std:: cout << n << std::endl;

    return 0;
}

结果如下:

$ ./test.exe
BER decode error

看起来你的公钥很糟糕。我不会浪费时间在它上面,因为我不清楚它是否是真正的钥匙,或者它是否是你的随机垃圾。

关于这个:

$ unzip -aoq Pem-pack.zip
$ ls pem*
pem-com.cpp  pem-create-keys.sh  pem-rd.cpp    pem-verify-keys.sh
pem-com.h    pem.h               pem-test.cxx  pem-wr.cpp

我使用脚本进行测试。您可以根据需要删除它们。如果需要,您也可以删除pem-test.cxx。它也不需要。

 $ rm pem-*.sh pem-test.cxx

答案 1 :(得分:0)

这是我将字符串加载到PublicKey

的方式
UPDATE Table1
SET val1 = IFNULL(val1,0) + @varRan:= FLOOR(5 + (RAND() * 6)), 
val2 = IFNULL(val2,0) + @varRan;

详细了解整个功能。在这里,我将密钥作为std :: string传递给函数以验证签名。 //Create Cryptopp StringSource From Std::string std::string PublicKeyString = "<Your key as std::string value>"; CryptoPP::StringSource PKeyStringSource(PublicKeyString, true); CryptoPP::RSA::PublicKey publicKey; publicKey.Load(PKeyStringSource); 是从RSA::PublicKey传递给函数

创建的
std::string