crypto ++将密钥保存到字节队列并返回密钥

时间:2014-03-03 22:04:49

标签: c++ encryption

我想使用RSA加密许可我的软件。我的软件有几个可执行文件,我打算让每个文件检查一个公共许可文件的签名,然后再继续它们的工作。我的目标不是要让规避许可保护成为不可能,只是让它变得非常困难。我知道没有人能让它变得不可能。

当前在Windows环境中运行的可执行文件,但它们只会在Linux环境中发布。

我目前的计划是将公钥放在每个可执行文件中以进行签名验证。这些程序已经有一个“安全”的加密区域,用于放置密钥。

我对这篇文章的问题是,我的实施方法有意义吗?还有另一种选择吗?将公钥放在单独的文件中的替代方法将允许黑客替换该文件并使用他们自己的许可文件和签名。这似乎并不安全。

此外,我一直在阅读crypto ++文档并运行示例代码以尝试完成此任务。我无法获得任何将密钥放入非文件接收器并再次返回的代码。所有示例都写入和读取文件。我需要能够从字符串或字节队列中保存和加载。下面是一个简单的尝试,但是当它运行时,我得到这个错误,当r2.BERDecodePrivateKey()执行时:

MyRSA.exe中0x7630c41f处的未处理异常:Microsoft C ++异常:内存位置0x002ef32c处的CryptoPP :: BERDecodeErr ..

#include <osrng.h>

#include "rsa.h"
using CryptoPP::RSA;

#include <queue.h>
using CryptoPP::ByteQueue;

int myCode_key2ByteQueueToKey(void)
{
    ////////////////////////////////////////////////////////////////////////
    // Generate the keys
    AutoSeededRandomPool rnd;

    CryptoPP::RSA::PrivateKey r1;
    r1.GenerateRandomWithKeySize(rnd, 2048);

    CryptoPP::RSA::PublicKey rsaPublic(r1);

    ////////////////////////////////////////////////////////////////////////
    // Put the 'inner' part of the key into a ByteQueue - whatever that is.
    ByteQueue queue;
    r1.DEREncodePublicKey(queue);

    ////////////////////////////////////////////////////////////////////////
    // Copy the byte queued inner key into another key
    CryptoPP::RSA::PrivateKey r2;
    r2.BERDecodePrivateKey(queue, false /*optParams*/, queue.MaxRetrievable());

    ////////////////////////////////////////////////////////////////////////
    // Validate the key made the trip in and out of a byte queue ok.
    if(!r1.Validate(rnd, 3)) printf("Validation of oringal key failed.\n");
    if(!r2.Validate(rnd, 3)) printf("Validation of reloaded key failed.\n");


    if(r1.GetModulus() != r2.GetModulus() ||
       r1.GetPublicExponent() != r2.GetPublicExponent() ||
       r1.GetPrivateExponent() != r2.GetPrivateExponent())
    {
        printf("Key didn't survive round trip in and out of a byte queue.");
    }

    return 0;
}

我没有修复上述代码。关于图书馆有一些我不了解的东西,因此缺少一些东西,但我必须继续前进。

我以为我会发布一个我找到的替代品。它是Crypto ++ wiki上的一个例子,它将密钥放入字符串(而不是文件)中,然后又重新出现。往返行程显示有效。

http://www.cryptopp.com/wiki/BERDecode

而不是

CryptoPP::RSA::PrivateKey 

它使用

CryptoPP::RSAES_OAEP_SHA_Decryptor

和公钥类似。这允许使用AccessKey()类不可用的成员函数PrivateKey

如果有人对原始代码进行了修复,我建议您发布它,因为它可以帮助我更好地理解这个库。

1 个答案:

答案 0 :(得分:1)

所以基本上你这样做:

  1. 生成2048位私钥
  2. 将DER格式的公开密钥从私钥的指数编码为您的bytequeue
  3. 尝试从字节序列&lt; - 这是错误
  4. 将其解析为私有
  5. 验证密钥......
  6. 您无法将公钥解码为私钥,某些编码标志会有所不同。


    至于CryptoPP::RSAES_OAEP_SHA_Decryptor

    将它用于密钥生成是一种很好的做法,因为它知道安全质数。

    用于一般解密任务也更简单,因为它包含一个对象中所需的一切。

    请参阅http://www.cryptopp.com/wiki/Keys_and_Formats#High_Level_Objects

    希望它有助于解决这个问题的最后答案;)