我想使用非对称加密算法,但我需要它有短密钥大小(不像rsa,它至少是384)。
我需要大约20岁。
有可能吗?
最佳答案
有几种方法可以获得短密钥大小。
一。使用RSA
rsa公钥由一个大数n(“模”)和一个(通常是小)数e(公共指数)组成。e可以小到3,在一个封闭的设置中(你控制密钥生成),你可以强制使用传统的e,对每个人都一样。n的典型大小为1024位(即128字节)。
n是两个素数(n=p*q)的乘积。p和q的知识足以重建私钥(名义上是e模p-1和q-1的乘法逆的值d)。假设n是已知的,仅p的知识就足够了(如果你知道n和p,你可以用简单的除法计算q)。为了适当的安全性,p和q应该有相似的大小,所以即使取两者中较小的一个,您仍然需要存储大约512位左右,即64字节)。
还建议选择一个小的d(“私有指数”)。但这使得e本质上是随机的,因此很大;您不能再对e使用常规的小值。这基本上是公钥大小的两倍。另外,强制一个小的d可以使密钥变弱(当d的大小不超过n大小的29%时,已经证明了这一点,但这并不能以任何方式证明30%的d是安全的)。这通常被认为是个坏主意。
2.使用dsa/diffie-hellman
dsa是一种数字签名算法。diffie-hellman是一种密钥交换算法。两者都是“非对称加密算法”,您可以根据需要使用其中一种或两种。在这两种情况下,都有一个公共数学组(对于基本dsa和dh,数字模大素数p;椭圆曲线变量使用椭圆曲线作为组);公钥是一个组元素,私钥是该元素相对于传统生成器的离散对数。换句话说,一个素数p和一个数g模p被给出(它们甚至可以被所有的密钥持有者共享);一个私钥是一个数x,对应于公钥y=gx模p。私钥被选择模一个小素数q已知,并且必须足够大,以便击败一般的离散对数算法;在实践中,我们希望160位或更多Q。
这意味着一个私钥可以容纳大约20个字节。不是20位小数,而是更接近的数字。
三。任何密码算法
生成密钥对时,使用:
确定的程序;
随机比特的来源。
例如,使用rsa,可以通过创建大小合适的随机奇数并循环直到找到质数来生成p和q。对于给定的随机源,整个过程是确定的:给定相同的随机位,这将找到相同的素数p和q。
因此,可以开发一个由密钥k播种的prng,并将其用作密钥生成过程的随机源。无论何时需要私钥,都可以使用k作为输入,再次运行密钥生成过程。还有,喂!你的私钥,你需要储存的,现在是k。
对于rsa,这使得私钥的使用非常昂贵(rsa密钥的生成并不容易)。然而,使用dsa/diffie-hellman,这将是非常便宜的:私钥只是一个随机数模q(组顺序),其生成成本比使用私钥进行数字签名或非对称密钥交换要低得多。
这将导致以下过程:
存储的“私钥”是k。
dsa/diffie-hellman的组参数在应用程序中是硬编码的;每个人都使用同一个组,这不是问题。组顺序是q,一个至少160位的已知素数。如果使用椭圆曲线变量,那么q是曲线的一个属性,因此是给定的。
当需要签名或执行密钥交换(密钥交换用于模拟非对称加密)时,需要计算sha-512(k),这将产生512位序列。取前半部分(256位),将其解释为一个数字(根据您的意愿,使用big endian或little endian约定,前提是您始终使用相同的约定),并将其模q减小以获取专用dsa密钥。类似地,使用sha-512输出的后半部分来获取私有dh密钥。
密钥生成有点偏颇,但这并不意味着会有太多安全问题。请注意,如果需要dsa密钥和dh密钥,则可以使用相同的组,但不应使用相同的私钥(因此使用了sha-512输出的两部分)。
K应该有多大?对于sha-512这样的散列函数,k可以是任意的位序列。但是,k应该足够宽,以击败彻底搜索。1024位rsa密钥或1024位dsa模(dsa的p模)提供的安全级别大致相当于80位对称密钥。类似地,dsa/dh的160位组顺序提供相同的级别。80位没那么多,如果你想被认真对待的话,你就不能低于80位。这意味着k应该在至少280个可能键的空间中被选择;换句话说,如果k被选择为均匀随机字节,那么它必须至少有10个字节长。对于十进制数字,您至少需要24位数字。任何低于这一标准的东西,本质上都是脆弱的,这是不可避免的。
标准警告:如果上面的任何东西对您来说都不明显或不清楚,那么甚至不要考虑实现它。加密算法的实现是很棘手的,特别是因为最致命的错误是无法测试的(这并不是因为程序运行正常并且看起来工作正常,它不包含安全弱点)。