C# 自定义非对称密码算法

C# 自定义非对称密码算法,c#,.net,algorithm,encryption,cryptography,C#,.net,Algorithm,Encryption,Cryptography,我想使用非对称加密算法,但我需要它具有短密钥大小(不像RSA,它至少是384)。 我需要大约20分钟。 可能吗 这是对密钥大小的.NET限制;RSA可用于任何密钥大小。这样做是没有意义的 试想一下,使用20位密钥,您可以在2^20次尝试中对其进行暴力破解,这在今天的计算机上太容易了。有几种方法可以获得短密钥大小 1。使用RSA RSA公钥由一个大的数字n(模数)和一个(通常是小的)数字e(公开指数)组成。e可以小到3,在一个封闭的设置中(您可以控制密钥生成),您可以强制使用传统的e,每个人都一样

我想使用非对称加密算法,但我需要它具有短密钥大小(不像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本质上是随机的,因此很大;对于e,您不能再使用常规的小值。这基本上是公钥大小的两倍。此外,强制一个小的d会使密钥变弱(已经证明,当d的大小不超过n大小的29%时,情况就是这样,但这并不能以任何方式证明30%的n大小的d是安全的)。这通常被认为是个坏主意

2。使用DSA/Diffie Hellman

DSA是一种数字签名算法。Diffie-Hellman是一种密钥交换算法。这两种算法都是“非对称加密算法”,您可以根据需要使用其中一种,也可以同时使用这两种算法。在这两种情况下,都有一个公共数学组(对于基本DSA和DH,数模大素数p;椭圆曲线变体使用椭圆曲线作为组);公钥是组元素,私钥是该元素相对于传统生成器的离散对数。换句话说,给出了素数p和模p的数g(它们可以被所有密钥持有者共享,甚至是);私钥是与公钥y=gx 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(组顺序)的随机数,其生成成本比使用私钥进行数字签名或非对称密钥交换要低得多

    这将导致以下程序:

    • 存储的“私钥”是K
    • DSA/Diffie-Hellman的组参数在应用程序中硬编码;每个人都使用同一组,这不是问题。组顺序是q,一个至少160位的已知素数。如果使用椭圆曲线变量,那么q是曲线的一个属性,因此是给定的
    • 当您需要签名或执行密钥交换(密钥交换用于模拟非对称加密)时,可以计算SHA-512(K),这将生成512位序列。取前半部分(256位),将其解释为一个数字(如果始终使用相同的约定,可以根据需要使用大端或小端约定),并将其按q模减少以获得私钥。类似地,您使用SHA-512输出的后半部分来获取私有DH密钥
    密钥生成有一点偏差,但这并不意味着有太多安全问题。请注意,如果需要DSA密钥和DH密钥,则可以使用相同的组,但不应使用相同的私钥(因此使用SHA-512输出的两部分)

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

    标准警告:如果出现上述任何情况