我想使用 RSA 加密许可我的软件。我的软件有几个可执行文件,我计划在他们继续做他们所做的事情之前让每个人检查一个通用许可文件的签名。我的目标不是让规避许可保护变得不可能,只是让它变得非常困难。我知道没有人可以让它成为不可能。
可执行文件目前在 Windows 环境中运行,但它们只会在 Linux 环境中运行。
我目前的计划是将公钥放入每个可执行文件中以进行签名验证。这些程序已经有一个“安全”的加密区域来放置 key 。
我对这篇文章的问题是,我的实现方法是否有意义?还有其他选择吗?将公钥放在单独文件中的替代方案将允许黑客替换该文件并使用他们自己的许可证文件和签名。这似乎不太安全。
此外,我一直在阅读 crypto++ 文档并运行示例代码来尝试完成此任务。我无法使用任何代码将 key 放入非文件接收器并再次返回。所有示例都写入和读取文件。我需要能够从字符串或字节队列中保存和加载。下面是一个简单的尝试,但是当它运行时我得到这个错误,当 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 上的一个示例,它将 key 放入字符串(而不是文件)并再次返回。往返行程显示有效。
http://www.cryptopp.com/wiki/BERDecode
代替
CryptoPP::RSA::PrivateKey
它使用
CryptoPP::RSAES_OAEP_SHA_Decryptor
公钥也是如此。这允许使用不适用于 PrivateKey
类的成员函数 AccessKey()
。
如果有人修复了原始代码,我强烈建议您将其发布,因为它可以帮助我更好地理解这个库。
最佳答案
所以基本上你这样做:
- 生成2048位私钥
- 将私钥的指数以 DER 格式编码为 公钥 到字节队列
- 尝试将其解码为字节队列中的私钥 <-- 此处是错误
- 验证 key ...
您不能将公钥解码为私钥,一些编码标志不同。
至于CryptoPP::RSAES_OAEP_SHA_Decryptor
将它用于 key 生成是一种很好的做法,因为它知道安全素数。
它也更易于用于一般解密任务,因为它在一个对象中包含了您需要的所有内容。
参见 http://www.cryptopp.com/wiki/Keys_and_Formats#High_Level_Objects
希望它能有所帮助,即使它是一个迟到的答案;)
关于c++ - crypto++ 将 key 保存到字节队列并返回到 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22158481/