2010-09-28 54 views
4

我想使用非对称加密算法,但我需要它具有较短的密钥大小(不像RSA至少是384)。 我需要它约20个。 这可能吗?自定义非对称加密算法

+4

密钥越短,代码越快被破坏。即使使用最慢的解密算法,20位密钥也会在几秒钟内破裂。 – cHao 2010-09-28 12:02:44

+1

你能解释一下为什么你想做这个看起来很疯狂的事情?什么可能的价值是*强加密*弱键*? – 2010-09-28 14:15:41

回答

3

有几种方法可以获得短密钥大小。

1. RSA

甲RSA公钥在于一个大数目Ñ(下称 “模量”)和一个(通常很小)数Ë(公共指数)。 e可以小到3,并且在一个关闭的设置中(您可以控制密钥生成),您可以强制使用常规的和,这对每个人都是一样的。 n的典型尺寸是1024位(即128字节)。

n是两个素数的乘积(n = p * q)。的pq知识就足以重建私钥(标称值d这是Ë模的乘法逆P-1Q-1)。假设ň众所周知,知识p的本身就足以(如果你知道ñp,你可以计算q用一个简单的除法)。为了保证安全,和和q应该有相似的大小,所以即使通过取两者中的较小者,仍然需要存储大约512位左右 - 即64位)。

也有人建议选择一个小的d(“私人指数”)。但这使得基本上是随机的,因此很大;您不能再使用传统的小值和。这基本上使公钥大小加倍。另外,迫使小d可以使键弱(它已被证明是这样的,当d的大小是ñ规模不超过29%,但不以任何证明方式是d的大小为的大小n是安全的)。这通常被认为是一个坏主意。

2. DSA /的Diffie-Hellman

DSA是一个数字签名算法。 Diffie-Hellman是一种密钥交换算法。两者都是“非对称加密算法”,您可以根据自己的需要使用其中一种或另外两种。在这两种情况下,都有一个公共数学小组(对于基本的DSA和DH,模数大素数p;椭圆曲线变体使用椭圆曲线作为组);公钥是一个群组元素,私钥是相对于常规发生器的该元素的离散对数。换句话说,给出一个素数pgp(它们可以由所有密钥持有者共享,甚至);私钥是对应于公钥的数字x y = g x mod p。私钥是以小素数q为模。 q是已知的并且必须足够大以便击败通用离散对数算法;在实践中,我们想要一个160位或更多的q

这意味着一个私钥可以容纳大约20个字节。这不是20位十进制数字,但更接近。

3.与任何加密算法

当你生成密钥对,你这样做:

  1. 确定性的过程;
  2. 随机位的来源。

例如,对于RSA,你产生p并通过创建大小合适的随机奇数和循环,直到一个素数被发现q。对于一个给定的随机源,整个过程是确定性的:给定相同的随机位,这将找到相同的素数pq

因此,您可以开发PRNG种子的密钥K,并将其用作密钥生成过程的随机源。只要您需要私钥,就可以再次运行密钥生成过程,使用K作为输入。瞧!您需要存储的私钥是K

使用RSA,这使得私钥使用非常昂贵(RSA密钥生成并不容易)。但是,使用DSA/Diffie-Hellman,这将非常便宜:私钥只是一个随机数模q(群组顺序),它可以使用私有密钥进行数字签名的成本低得多非对称密钥交换。

这导致了以下程序:

  • 的 “私钥”,如存储,是ķ
  • DSA/Diffie-Hellman的组参数在应用程序中被硬编码;每个人都使用同一个组,这不是问题。群组顺序是q,这是已知的至少160位的素数。如果使用椭圆曲线变体,那么q是曲线的一个属性,因此是给定的。
  • 当您需要签名或执行密钥交换时(密钥交换用于模拟非对称加密),您计算SHA-512(K),这会产生512位序列。你取前半部分(256位),将其解释为一个数字(只要你总是使用相同的约定,就可以按照你的意愿使用大端或小端约定),然后将其减少模q以获得私人DSA密钥。同样,您可以使用SHA-512输出的后半部分来获取专用DH密钥。

关键一代是有点偏颇,但这并不意味着很多安全问题。请注意,如果您需要一个DSA密钥一个DH密钥,那么您可以使用相同的组,但您不应该使用使用相同的私钥(因此使用两个SHA-512输出的一半)。

应该有多大K?使用诸如SHA-512的散列函数,K可以是任意位的任意序列。但是,K应足够宽以击败穷举搜索。 1024位RSA密钥或1024位DSA模数(DSA模数)提供的安全级别与80位对称密钥非常相似。同样,DSA/DH的160位组订单也提供相同的级别。 80位并不多;如果你想被认真对待,你不能低于这个水平。这意味着K应该在至少2个可能的密钥空间中选择;换句话说,如果选择K作为统一的随机字节,则它必须至少有10个字节长。用十进制数字,你至少需要24位数字。低于这个水平的东西本质上是脆弱的,这是不可避免的。

标准警告:如果上述任何内容对您而言并不明显或清晰,那么请不要考虑实施它。加密算法的实现是棘手的,尤其是因为最致命的错误不能被测试(这不是因为程序运行并且似乎正常工作以致它不包含安全弱点)。

4

这是对密钥大小的.NET限制; RSA可以用于任何密钥大小。这样做没有意义。

想一想,使用20位密钥,您可以在2^20次尝试中蛮力,并且这对今天的计算机来说太简单了。

+0

让我纠正我的陈述,我需要它约20位数字。 – Ali 2010-09-28 12:34:59

+0

让我纠正我的陈述,我需要它约20位数。感谢您的答案。 – Ali 2010-09-28 12:35:22

2

如果您可以找到它的标准实现,您可能需要考虑使用椭圆曲线密码学。它提供了与RSA相同程度的防暴力保护,并且密钥长度大大缩短。

关于烹饪自己的密码系统的标准声明当然适用于此处。