1

我需要签署少量数据(并将该签名存储在类似的小空间中) - 标准 PKCS 签名太大,我需要 8 - 16 字节签名区域内的东西。其次,我需要它是一个非对称加密,第三,我需要它是相对安全的(用今天的计算机在 5 分钟内不会被破坏)。

我希望:

  1. 使用 CRC 算法(CRC32 或 CRC64)生成数据的散列,这将产生 4 或 8 个字节的散列数据。
  2. 然后用私钥加密该数据,并在最后附加结果。

然而,使用 RSA 加密,RSA 产生的输出与密钥最小值一样长 - 因此 512 RSA 密钥将产生 64 字节的数据。还有哪些其他选择?

编辑:通过不对称加密,我的意思是我不能拥有任何共享秘密,即有一个签名“服务器”将拥有一个秘密,以及一个分布式公共应用程序需要验证数据是否来自该来源所以不能包含签名秘密。

4

3 回答 3

2

我不认为你的要求是可以得到的。您可以获得的最接近的可能是椭圆曲线,但即便如此,您也会得到至少 192 / 8 * 2 = 48 字节的输出。使用 160 位曲线,您可以将其降低到 40 字节,但之后安全边际变得太低。这个答案前面提到了点压缩,但这可能无法使用

最好使用安全散列,然后仅使用前 X 位,而不是使用非安全散列(例如 CRC)。使用 ECC 160 位 SHA-1 是显而易见的选择,对于如此小的数据部分,SHA-1 将足够强大。安全散列的想法是没有人可以创建另一个映射到相同散列的消息。这不是 CRC 或 Adler 等函数的属性。

于 2012-08-10T15:02:44.967 回答
2

基于数字签名和消息恢复的解决方案

假设您要存储的消息M可以分为两部分: M 1和 M 2,并且M = M 1 ||M 2

通常,消息恢复方案中的验证步骤会告诉您M是否真实,但它也会返回一个段(例如M 2),因此您实际上只需要存储另一个段(例如M 1)。一个缺点是,如果不先验证签名,您就无法访问M 2,但在大多数情况下,这确实不是人们想要做的。

直观地说,一些存储既可以用于消息一部分,也可以用于签名的一部分。

最普遍的例子可能是标准化为 ISO 9796-2 的方案(这并不完全安全!请阅读下文......)。在该方案中,耦合到 SHA-1 的 2048 位 RSA 签名可用于存储 234 字节的M 2。实际上,这意味着签名长度从 20 到 256 个字节不等,具体取决于M的长度。

更具体地说,如果n是您的 RSA 密钥的长度并且h是哈希输出的长度(均以位为单位),则您可以在签名中存储的字节数为(nh-16)/8

它对您是否有益取决于您的数据有多长。

我上面提到的警告是,Coron、Naccahe、Tibouchi 和 Weinmann最近表明,ISO 9796-2 可以比人们预期的更容易破解,即使不是“在一台计算机上 5 分钟内”(他们不得不诉诸几个EC2 实例)。然而,在安全方面,它可能对您来说已经足够好了。

存在其他消息恢复方案,但您应该注意的一件事是它们的专利状态。例如,PSS-R、Naccache-Stern、Nyberg-Rueppel、Pintsov-Vanstone不能自由使用。

基于带附件签名的解决方案

DSA是一种可能性。在这种情况下,签名不会嵌入原始消息的任何部分。一般规则是,如果您想要s位的安全性,则需要4s位长的 DSA 签名。也就是说,对于 80 位安全性(相当于 2TDES),您需要 40 个字节。相同的公式适用于ECDSA,但 DSA 在软件库中更简单且更广泛。

在这两种情况下(DSA 和 ECDSA),签名服务器必须具有良好的随机性来源。如果随机生成器不可靠(例如,如果服务器是虚拟机或嵌入式系统),则无论签名有多长,DSA 和 ECDSA 都可能被破坏。

于 2012-08-10T15:28:42.537 回答
-3

你的要求是自相矛盾的。

签署少量数据

这大概是一个安全的摘要(散列)

我需要它是一个非对称加密

但这是可逆的,因此不是安全的摘要。

然而,使用 RSA 加密,RSA 产生的输出与密钥最小值一样长

使用任何可逆加密都会产生与密钥最小值一样长的输出。

如果您只需要哈希,则使用盐渍 md5(16 字节)。

于 2012-08-10T13:56:26.413 回答