自定义非对称密码算法

Ali*_*Ali 5 .net c# encryption algorithm cryptography

我想使用非对称加密算法,但我需要它有短的密钥大小(不像RSA,至少384).我需要它大约20左右.有可能吗?

Tho*_*nin 3

有多种方法可以实现短密钥大小。

\n\n

1.使用RSA

\n\n

RSA 公钥由一个大数n(“模数”)和一个(通常很小)数e(公共指数)组成。e可以小到 3,并且在封闭设置(您控制密钥生成)中,您可以强制使用传统的e,对每个人都一样。n的典型大小是 1024 位(即 128 字节)。

\n\n

n是两个素数的乘积 ( n = p*q )。了解pq足以重建私钥(名义上是值d ,它是ep-1q-1的乘法逆元)。假设n已知,仅了解p就足够了(如果您知道np,则可以通过简单的除法计算q )。为了适当的安全性,pq应该具有相似的大小,因此即使采用两者中较小的一个,您仍然需要存储大约 512 位左右(即 64 字节)。

\n\n

还建议选择较小的d(“私有指数”)。但这使得e本质上是随机的,因此很大;您不能再对e使用传统的小值。这基本上使公钥大小加倍。此外,强制使用较小的d可能会使密钥变弱(已经证明,当d的大小不超过n大小的 29%时就会出现这种情况,但这并不能以任何方式证明 d30 % n的大小是安全的)。这通常被认为是一个坏主意。

\n\n

2. 使用 DSA/Diffie-Hellman

\n\n

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

\n\n

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

\n\n

3. 使用任何加密算法

\n\n

当您生成密钥对时,您可以使用以下命令:

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

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

\n\n

因此,您可以开发一个由秘密密钥K播种的 PRNG ,并将其用作密钥生成过程的随机源。每当您需要私钥时,您都可以使用K作为输入再次运行密钥生成过程。瞧\xc3\xa0!您需要存储的私钥现在是K

\n\n

对于 RSA,这使得私钥的使用相当昂贵(RSA 密钥生成并不容易)。然而,对于 DSA / Diffie-Hellman,这将非常便宜:私钥只是一个随机数模q(群阶)为模的随机数,生成它的成本比使用私钥进行数字签名或非对称签名要低得多。密钥交换。

\n\n

这导致以下过程:

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

密钥生成有轻微偏差,但这并不意味着有太大的安全问题。请注意,如果您需要 DSA 密钥DH 密钥,则可以使用同一组,但不应使用相同的私钥(因此使用 SHA-512 输出的两半)。

\n\n

K应该有多大?对于 SHA-512 等哈希函数,K可以是任意任意位序列。然而,K应该足够宽以击败穷举搜索。1024 位 RSA 密钥或 1024 位 DSA 模数( DSA 的p模数)提供的安全级别大致相当于 80 位对称密钥。类似地,DSA/DH 的 160 位组顺序提供相同的级别。80 位并不算多;如果你想被认真对待,你就不能低于这个标准。这意味着K应该在至少有2 80个可能的键的空间中选择;换句话说,如果K被选为均匀随机字节,那么它的长度必须至少为10个字节。对于十进制数字,您至少需要 24 位数字。任何低于这个值的东西本质上都是弱的,这是不可避免的。

\n\n

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

\n