【问题标题】:crypto++ saving key to a byte queue and back to a keycrypto++ 将密钥保存到字节队列并返回到密钥
【发布时间】:2014-04-05 04:37:41
【问题描述】:

我想使用 RSA 加密来许可我的软件。我的软件有几个可执行文件,我计划让每个可执行文件在他们继续做他们所做的事情之前检查一个公共许可证文件的签名。我的目标不是让绕过许可保护成为不可能,只是让它变得非常困难。我知道没有人能做到。

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

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

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

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

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

#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 类不可用。

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

【问题讨论】:

  • 呃,r2 的私钥是哪来的?稀薄的空气?
  • 行声明:CryptoPP::RSA::PrivateKey r2;在下一行中,我试图将它的值分配给字节队列的值。
  • 将其放入 try catch 中,看看异常说明了什么。
  • 不错的主意,但没有成果。收到消息:“错误:BER 解码错误”。

标签: c++ encryption


【解决方案1】:

所以基本上你这样做:

  1. 生成 2048 位私钥
  2. public 密钥以 DER 格式从您的私钥的指数编码到您的字节队列
  3. 尝试将其解码为字节队列中的私有密钥
  4. 验证密钥...

您无法将公钥解码为私钥,某些编码标志不同。


至于CryptoPP::RSAES_OAEP_SHA_Decryptor

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

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

http://www.cryptopp.com/wiki/Keys_and_Formats#High_Level_Objects

希望它有帮助,即使它是一个迟到的答案;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多