穷人序列号生成方案

我想得到一些简单的方案/算法,用于根据一些独特的硬件ID(cpu id或以太网mac地址或硬盘序列号)生成序列号。

我希望方案只能在一个方向上工作 – 因此客户端计算机上的应用程序可以validation序列号但不生成序列号。 (所以破解并不简单)。

现在很可能你们大多数人都会推荐某种RSA公钥/私钥对加密,它可以足够可靠地工作 – 客户端没有私有RSA密钥,所以他不能“生成”序列号。

但是RSA签名的主要问题是它太大了 – 它的签名大小是128或256字节,具体取决于RSA密钥大小( RSA签名大小? )

  • 我希望序列号是从邮件到注册表单的简单复制粘贴 – 所以最多64个字符,理想情况下是32个字节。

好吧,现在你可能会说这种保护措施不足以抵御蛮力的黑客行为 – 你只需要尝试所有组合以确定正确的序列号。

但我想说,通常你需要聘请“昂贵”的黑客或黑客团队来创建这种暴力破解应用程序。

此外,我认为可以为下一版本的应用程序更改序列号生成算法,或使用多轮传递来显着减慢暴力。

作为基础,我更喜欢使用普通的C或C ++(而不是C#),最好是Windows / wincrypt.h或任何现有的普通C源代码(最好不是巨大的第3方库)。

是否可以创建RSA公钥/私钥对,因此签名大小为32个字符?

您可能想查看ECDSA 。

ECDSA是一种类似RSA的公钥算法,但密钥和签名大小比RSA短,可提供相同级别的有效安全性。 ECDSA基于椭圆曲线加密。 在RSA中使用的整数因子分解问题和在ECDSA中使用的椭圆曲线都降低到离散对数问题,这被认为是难以解决的。

例如,对于与1024位RSA相同的安全级别(估计具有大约80位的安全性),您可以使用160位ECDSA密钥,该密钥可生成320位签名。 您可以将32位签名base64编码为54个字符的字符串,或者将ascii85编码为50个字符的字符串。

或者,如果要使用base64编码保留32个字符(最多可保存192位数据),则可以使用96位密钥大小的ECDSA。 96位ECDSA的有效强度是48位,这通常不足以进行正确的加密,但在您的情况下,攻击者可能仍然更容易对程序进行反向工程以删除许可证密钥检查而不是尝试生成伪造的密钥。

您正在寻找加密哈希函数。 一个很好的例子,适合你想要的32个字符,将是md5 。

我决定发布我自己的解决方案,这个解决方案正在使用现在在这个论坛上提出的ECDSA私钥/公钥对,并且包括我在这里问过的双向加密算法的使用: 穷人序列号生成方案,部分2

代码可能仍然包含一些错误,但我已尽力做到最好并测试我能做的一切。

它还使用托管代码部分和C#代码来测试C ++代码,但根据您的实现,您可能希望完全删除托管部分。

由于答案的大小在这里受到限制,我不得不将我的代码放在外部url上 – 所以答案的大小应该足够小。

这是我的代码snipets:

  • SerialNumberRegister.h
  • SerialNumberRegister.cpp
  • DemoForm.cs

第三个代码是不完整的 – 它只是演示代码如何编码。 如果你不使用C#,那么上层可能是其他东西。

对于EDSCA签名algorihtm我使用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跳得很短,没有操作),但这总是可以执行的。

目标是通过为串行密钥生成引入简单,小巧且漂亮的解决方案来使黑客的生活更加困难 – 解决方案可以简单地从一种产品复制粘贴到另一种产品。