Java EC签名尺寸?

Java EC签名尺寸?,java,security,cryptography,digital-signature,Java,Security,Cryptography,Digital Signature,我已经为此挣扎了一段时间。这是我的设想。我正在尝试生成25个字符的软件产品密钥(比如微软风格的FFFFF-eeee-DDDDD-BBBBB-77777)。我已经成功地通过nonce(原始产品密钥)生成了产品密钥——根据本文,我的最终产品密钥(在以base 24格式编码之前)应该正好是15个字节(nonce为4个字节,数字签名为11个字节) 现在的问题是如何生成11字节的签名?我尝试过使用目前最短的签名加密(ECC——使用一条secp128r2曲线——它给了我一个128位的私钥)。签名后,签名的大

我已经为此挣扎了一段时间。这是我的设想。我正在尝试生成25个字符的软件产品密钥(比如微软风格的FFFFF-eeee-DDDDD-BBBBB-77777)。我已经成功地通过nonce(原始产品密钥)生成了产品密钥——根据本文,我的最终产品密钥(在以base 24格式编码之前)应该正好是15个字节(nonce为4个字节,数字签名为11个字节)

现在的问题是如何生成11字节的签名?我尝试过使用目前最短的签名加密(ECC——使用一条secp128r2曲线——它给了我一个128位的私钥)。签名后,签名的大小为80字节(由Java语句打印)

System.out.println("length: "+signedProductKeyBytes.length);
我的问题是:

  • EC密钥大小(以位为单位)之间的关系到底是什么 以及生成的EC签名的长度(以字节为单位)

  • 例如,128位的EC密钥应该产生 签名大小为多少字节

  • 我如何生成一个11字节的签名(顺便问一下,我肯定有 在WindowsXP时代没有EC密钥,所以微软没有使用EC-is 有更好的方法吗?比如说使用RSA 32位密钥或其他什么?)

  • 也会计算字符串的大小(在我的例子中,字符串只有9) 签名的字符(如“123456789”)在最终长度中起作用 签名

  • 我已经为此挣扎了一段时间,在网上到处搜索——有很多技术讲座的答案——但没有具体回答我的问题(最近的一次是)

    我希望我能得到一些快速的回应——我的项目已经晚了几个星期了。
    谢谢大家!

    据我所知,没有安全的签名方案可以生成这么小的签名

    • 原始ECC签名(ECDSA等)是安全级别的四倍。如果您想要80位的安全级别(使用160位曲线),您将获得40字节的签名。您可以减少几个字节,牺牲一点安全性,但在20到30字节之间的某个位置断开它将变得微不足道

      128位曲线(64位安全性,可以被破坏,但它可能太昂贵而不值得)将生成32字节的签名

    • 有限域签名(DSA等)与具有相同安全级别ECC的签名具有相同的大小

    • RSA签名的大小与模数相同。使用相当小的768位密钥,可以获得96字节的签名

    • BLS签名非常接近。签名大小仅为安全级别的两倍。80位级别为20字节。64位级别为16字节。您应该能够通过截断另外两个字节左右,以换取更高的签名验证时间


    为什么不抓取现有80字节中的前11个字节?只要它是唯一的,您是否关心其他属性…?Rory,非常感谢您的快速响应!(1)如何验证签名?如果我使用公钥仅验证前11个字节,代码是否仍然有效?(2)由于截断,2个或更多签名的前11个字节是否可能匹配(不是唯一的)?感谢有价值的解释。那么解决此问题的最佳方法是什么?正如您所提到的-araw ECC签名(ECDSA)是4倍安全级别。那么,为什么我得到的签名的字节数组大小是34(由Java byte[]signedBytes=ecdsa.sign()打印;signedBytes.length显示80),而不是(128/8=32字节),我使用的是secp128r2?你是说使用secp128r2曲线是不安全的,因为它的长度不超过20字节,而且很容易被破坏?你的签名大小是多少?34或80?34可以用一些ASN.1/BER相关的开销来解释。破坏128位椭圆曲线是可能的,但代价很高。@CodesInChaos正确,java输出X9。62个兼容的签名(两个有符号整数值的序列)我的签名大小是34。那么,解决这个问题最安全、最快捷的方法是什么呢?嘿,伙计们,有没有进一步的帮助?