我已经挣扎了一段时间。这是我的情景。我正在尝试生成25个字符的软件产品密钥(如Microsoft风格的FFFFF-EEEEE-DDDDD-BBBBB-77777)。我已经通过nonce(原始产品密钥)成功生成 - 根据这篇文章,我的最终产品密钥(在以24格式编码之前)应该恰好是15个字节(我的随机数为4个字节,我的数字签名为11个字节)。 / p>
现在问题是我如何生成一个11字节的签名?我尝试使用当前最短的签名加密(ECC - 使用secp128r2曲线 - 它给我一个128位私钥)。签名后,我的签名大小为80字节(由Java语句打印
System.out.println("length: "+signedProductKeyBytes.length);
我的问题是:
EC密钥大小(以位为单位)之间的关系到底是什么 以及生成的EC签名的长度(以字节为单位)?
例如,128位的EC密钥应该产生一个 签名大小是多少字节?
如何生成11字节签名(顺便说一下,我确定在那里 在Windows XP时代,没有EC密钥 - 所以MS没有使用EC - 是 还有更好的方法吗?比如说使用RSA 32位密钥?)?
也是字符串的大小(在我的例子中,它只是一个9的字符串 例如签名的“123456789”在最终长度中起作用 签名?
已经挣扎了一段时间,在网上到处搜索 - 通过大量的技术会谈回答 - 但没有具体回答我的问题(我得到的最近的是this article for RSA keys)
我希望我得到一些快速反应 - 我的项目已经推迟了好几周。 谢谢你们!
答案 0 :(得分:6)
我知道没有生成小签名的安全签名方案。
原始ECC签名(ECDSA等)是安全级别的四倍。如果您需要80位安全级别(使用160位曲线),您将获得40个字节的签名。你可以减少几个字节,牺牲一些安全性,但是将它打破到20到30个字节之间变得微不足道。
128位曲线(64位安全性,可以打破,但它可能太贵而不值得)会产生32字节的签名。
有限字段签名(DSA等)与具有相同安全级别ECC的签名具有相同的大小。
RSA签名与模数大小相同。使用相当小的768位密钥,您可以获得96字节的签名。
BLS签名非常接近。签名大小只是安全级别的两倍。 80位的20个字节。 64位的16字节。你应该能够通过截断来削减另外两个字节,以换取更高的签名验证时间。