[英]Custom Asymmetric Cryptography Algorithm
我想使用非对称加密算法,但我需要它有短的密钥大小(不像RSA,至少384)。 我需要它大约20左右。有可能吗?
这是密钥大小的.NET限制; RSA可以与任何密钥大小一起使用。 这样做是没有意义的。
考虑一下,使用20位密钥,您可以在2 ^ 20次尝试中强制使用它,这对于今天的计算机来说太简单了。
有几种方法可以使用短密钥。
1.使用RSA
RSA公钥包含大数n (“模数”)和(通常小)数e (公共指数)。 e可以小到3,在封闭设置中(你控制密钥生成)你可以强制使用传统的e ,每个人都一样。 n的典型大小是1024位(即128字节)。
n是两个素数( n = p * q )的乘积。 知道p和q足以重建私钥(名义上是值d ,它是e模p-1和q-1的乘法逆)。 假设n是已知的,单独知道p就足够了(如果你知道n和p ,你可以用简单的除法计算q )。 为了保证适当的安全性, p和q应该具有相似的大小,所以即使采用两者中较小的一个,你仍然需要存储大约512位左右 - 即64字节)。
还建议选择一个小d (“私人指数”)。 但这使得e基本上是随机的,因此很大; 你可以不再使用传统的小数值为电子商务 。 这基本上使公钥大小加倍。 同样,强制小d可以使关键弱(当d的大小不超过n的大小的29%时已经证明是这种情况,但是这并不能证明d的大小为30) n的大小是安全的)。 这通常被认为是一个坏主意。
2.使用DSA / Diffie-Hellman
DSA是一种数字签名算法。 Diffie-Hellman是一种密钥交换算法。 两者都是“非对称加密算法”,您可以根据需要使用其中一种或两种,或两种。 在这两种情况下,都有一个公共数学组(数字模拟基本DSA和DH的大素数p ;椭圆曲线变体使用椭圆曲线作为组); 公钥是一个组元素,私钥是该元素相对于传统生成器的离散对数 。 换句话说,给出了素数p和数g g模p (它们可以由所有密钥持有者共享,甚至); 私钥是对应于公钥y = g x mod p的数字x 。 私钥选择模数小q 。 q是已知的并且必须足够大以便击败通用的离散对数算法; 实际上,我们想要一个160位或更多的q 。
这意味着私钥适合大约20个字节。 这不是20个十进制数字,而是更接近。
3.使用任何加密算法
生成密钥对时,请执行以下操作:
例如,使用RSA,您可以通过创建正确大小的随机奇数并循环直到找到素数来生成p和q 。 对于给定的随机源,整个过程是确定性的:给定相同的随机位,这将找到相同的素数p和q 。
因此,您可以开发由密钥K播种的PRNG,并将其用作密钥生成过程的随机源。 只要您需要私钥,就可以使用K作为输入再次运行密钥生成过程。 瞧! 你的私钥,你需要存储的私钥现在是K.
使用RSA,这使得私钥使用非常昂贵(RSA密钥生成并不容易)。 但是,对于DSA / Diffie-Hellman,这将是非常便宜的:私钥只是一个模q (组顺序)的随机数,它可以比使用私钥进行数字签名或不对称的成本低得多。密钥交换。
这导致以下过程:
密钥生成略有偏差,但这并不意味着很多安全问题。 请注意,如果您需要DSA密钥和 DH密钥,则可以使用相同的组,但不应使用相同的私钥(因此使用SHA-512输出的两半)。
K应该有多大? 使用诸如SHA-512之类的散列函数, K可以是任意位序列。 然而, K应该足够宽以击败穷举搜索。 1024位RSA密钥或1024位DSA模数(DSA的p模数)提供的安全级别大致相当于80位对称密钥。 类似地,DSA / DH的160位组顺序提供相同的级别。 80位并不是那么多; 如果你想被认真对待,你不能低于那个。 这意味着应该在至少2 80个可能键的空间中选择K ; 换句话说,如果选择K作为均匀随机字节,那么它必须至少为10个字节长。 使用十进制数字,您至少需要24位数字。 任何低于此的东西本质上都是弱的,这是不可避免的。
标准警告:如果上述任何内容对您来说不明显或不清楚,那么甚至不要考虑实施它。 加密算法的实现是棘手的,特别是因为无法测试最致命的错误(这不是因为程序运行并且似乎正常工作,因为它不包含安全漏洞)。
如果您可以找到它的标准实现,您可能需要考虑使用椭圆曲线加密。 它提供与RSA相同的防蛮力保护,密钥长度大大缩短。
当然,关于烹饪自己的密码系统的标准免责声明适用于此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.