繁体   English   中英

自定义非对称密码算法

[英]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 )的乘积。 知道pq足以重建私钥(名义上是值d ,它是ep-1q-1的乘法逆)。 假设n是已知的,单独知道p就足够了(如果你知道np ,你可以用简单的除法计算q )。 为了保证适当的安全性, pq应该具有相似的大小,所以即使采用两者中较小的一个,你仍然需要存储大约512位左右 - 即64字节)。

还建议选择一个小d (“私人指数”)。 但这使得e基本上是随机的,因此很大; 你可以不再使用传统的小数值为电子商务 这基本上使公钥大小加倍。 同样,强制小d可以使关键弱(当d的大小不超过n的大小的29%时已经证明是这种情况,但是这并不能证明d的大小为30) n的大小是安全的)。 这通常被认为是一个坏主意。

2.使用DSA / Diffie-Hellman

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

这意味着私钥适合大约20个字节。 这不是20个十进制数字,而是更接近。

3.使用任何加密算法

生成密钥对时,请执行以下操作:

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

例如,使用RSA,您可以通过创建正确大小的随机奇数并循环直到找到素数来生成pq 对于给定的随机源,整个过程是确定性的:给定相同的随机位,这将找到相同的素数pq

因此,您可以开发由密钥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位并不是那么多; 如果你想被认真对待,你不能低于那个。 这意味着应该在至少2 80个可能键的空间中选择K ; 换句话说,如果选择K作为均匀随机字节,那么它必须至少为10个字节长。 使用十进制数字,您至少需要24位数字。 任何低于此的东西本质上都是弱的,这是不可避免的。

标准警告:如果上述任何内容对您来说不明显或不清楚,那么甚至不要考虑实施它。 加密算法的实现是棘手的,特别是因为无法测试最致命的错误(这不是因为程序运行并且似乎正常工作,因为它不包含安全漏洞)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM