Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 穷人序列号生成方案_C_Encryption_Rsa Key Fingerprint - Fatal编程技术网

C 穷人序列号生成方案

C 穷人序列号生成方案,c,encryption,rsa-key-fingerprint,C,Encryption,Rsa Key Fingerprint,我想获得一些简单的方案/算法,用于根据一些唯一的硬件id(cpu id或以太网mac地址或硬盘序列号)生成序列号 我希望该方案只在一个方向上工作-所以客户端机器上的应用程序可以验证序列号,但不能生成序列号。(因此破解并不容易) 现在,你们中的大多数人可能会推荐某种RSA公钥/私钥对加密,它可以足够可靠地工作——客户机没有RSA私钥,所以他无法“生成”序列号 但RSA签名的主要问题是它太大了——它的签名大小是128或256字节,这取决于RSA密钥的大小() 我想序列号是简单的复制粘贴从邮件到注册

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

我希望该方案只在一个方向上工作-所以客户端机器上的应用程序可以验证序列号,但不能生成序列号。(因此破解并不容易)

现在,你们中的大多数人可能会推荐某种RSA公钥/私钥对加密,它可以足够可靠地工作——客户机没有RSA私钥,所以他无法“生成”序列号

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

  • 我想序列号是简单的复制粘贴从邮件到注册表-所以最多64个字符,理想的32字节
好吧,现在你可能会说,这种保护对于暴力黑客来说还不够好——你只是尝试所有的组合来确定正确的序列号

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

另外,我认为可以为下一版本的应用程序更改序列号生成算法,或者使用多轮传递来显著降低暴力的速度

作为一个基点,我更喜欢使用C或C++(不是C语言),最好是Windows /WINCRIPT。h或任何现有的C源代码(最好不是巨大的第三方库)。


是否可以创建RSA公钥/私钥对,使签名长度为32个字符?

您正在寻找加密哈希函数。一个适合您所需的32个字符的好例子是。

您可能想签出

ECDSA是一种与RSA类似的公钥算法,但与RSA相比,它的密钥和签名长度更短,从而提供相同级别的有效安全性。ECDSA基于椭圆曲线密码。RSA中使用的整数分解问题和ECDSA中使用的椭圆曲线问题都归结为离散对数问题,这被认为是很难解决的问题

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


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

我决定发布我自己的解决方案,目前正在使用本论坛提出的ECDSA私钥/公钥对,包括双向加密算法的使用,我在这里已经询问过:

代码可能仍然包含一些bug,但我已经尽了最大努力,尽我所能测试了所有东西

它还使用托管代码部分和C代码来测试C++代码,但是根据您的实现,您可能希望完全退出托管部分。 因为答案的大小在这里是有限的,所以我必须把我的代码放在外部url上,这样答案的大小就足够小了

以下是我的代码:

第三个代码是不完整的-它只是演示代码如何编码。如果不使用C#,则上层可能是其他的

对于EDSCA signing algorihtm,我使用了一个非常小的修正,以缩短签名的大小:

/* Curve selection options. */
#define secp128r1 16

#ifndef ECC_CURVE
    #define ECC_CURVE secp128r1
#endif
  • 所以尽可能小的签名大小
现在,当您开始检查代码时—您会注意到公钥和私钥对没有初始化—因为它们与我的产品紧密绑定。但是让我在这里发布一些演示密钥(我使用了当前代码来初始化它们)

因此,对于当前的公钥/私钥对-对于硬件id 000000000000(源自网卡mac地址)-以下序列密钥有效:

pc000000000000-NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=
现在包含签名部分(“pc000000000000”)和签名本身(“NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=”)

现在,最好的部分是,您现在有了我的解决方案的完整源代码,包括公钥和私钥。缺少的是我用来加密管理员私钥的密码,但没有它,您无法生成序列号。我现在挑战黑客破解这个解决方案——为我的软件创建串行密钥生成器。非常有趣的两难境地-您有完整的源代码,但对您来说毫无用处。:-)

我认为破解软件仍然是可能的(Asm的跳转短路,没有操作),但这总是可以执行的


目标是通过引入简单、小巧、美观的串行密钥生成解决方案,使黑客的生活更加艰难。该解决方案可以简单地从一个产品复制粘贴到另一个产品。

Hardware id=>(md5哈希算法)=>序列号客户端也可以使用此方案生成相同的序列号?我可能会检查此解决方案:它是否在windows上工作。以下是我问题的继续部分——第2部分:
pc000000000000-NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=