我决定发布我自己的解决方案,该解决方案现在正在这个论坛 ECDSA 私钥/公钥对上提出,并包括我在这里询问过的双向加密算法的使用:
Poor man serial number generation scheme,part 2
代码可能仍然包含一些错误,但我已尽力做到最好并测试我所能做的一切。
它还使用托管代码部分和 C# 代码来测试 C++ 代码,但根据您的实现,您可能希望完全删除托管部分。
因为这里答案的大小是有限的,所以我不得不把我的代码放在外部 url 上——所以答案的大小会足够小。
这是我的代码片段:
第三个代码不完整 - 它只是如何编码的演示代码。如果你不使用 C#,那么上层可能是别的东西。
对于 EDSCA 签名算法,我使用了https://github.com/esxgx/easy-ecc并进行了很少的修复 - 以缩短签名的大小:
/* Curve selection options. */
#define secp128r1 16
#ifndef ECC_CURVE
#define ECC_CURVE secp128r1
#endif
现在,当您开始检查代码时 - 您会注意到公钥和私钥对未初始化 - 因为它们与我的产品紧密绑定。但是让我在这里发布一些演示密钥(我已经使用当前代码来初始化它们)
unsigned char publicKey[] = {
0x03, 0x7A, 0x0E, 0xE4, 0x2C, 0xC1, 0x29, 0x1D, 0x22, 0xCF, 0x6F, 0xCE, 0x03, 0x5F, 0xBF, 0x31, 0xDD,
};
unsigned char encryptedPrivateKey[] = {
0x9E, 0x8C, 0x4C, 0x8F, 0x02, 0x1D, 0x7E, 0x34, 0xA0, 0xDB, 0xBC, 0x45, 0xD8, 0x1A, 0x57, 0x7A,
};
因此,对于当前的公钥/私钥对 - 对于硬件 id 000000000000(从网卡 MAC 地址派生) - 以下序列密钥是有效的:
pc000000000000-NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=
这现在包含签名部分 ("pc000000000000") 和签名本身 ("NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=")。
现在最好的部分是您现在拥有我的解决方案的完整源代码,包括公钥和私钥。缺少的是我用来加密管理员私钥的密码 - 但没有它,您将无法生成序列号。我现在挑战黑客破解这个解决方案 - 为我的软件创建串行密钥生成器。相当有趣的困境——你有完整的源代码,但它对你没用。:-)
我认为破解软件还是有可能的(Asm 的跳转短,无操作),但这是总是可以执行的。
目标是通过引入简单、小巧且漂亮的串行密钥生成解决方案来让黑客的生活变得更加艰难——该解决方案可以简单地从一种产品复制粘贴到另一种产品。