C# 自定义非对称密码算法
我想使用非对称加密算法,但我需要它具有短密钥大小(不像RSA,它至少是384)。 我需要大约20分钟。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,每个人都一样
可能吗 这是对密钥大小的.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。使用任何加密算法 生成密钥对时,可以使用以下方法:
- 存储的“私钥”是K
- DSA/Diffie-Hellman的组参数在应用程序中硬编码;每个人都使用同一组,这不是问题。组顺序是q,一个至少160位的已知素数。如果使用椭圆曲线变量,那么q是曲线的一个属性,因此是给定的
- 当您需要签名或执行密钥交换(密钥交换用于模拟非对称加密)时,可以计算SHA-512(K),这将生成512位序列。取前半部分(256位),将其解释为一个数字(如果始终使用相同的约定,可以根据需要使用大端或小端约定),并将其按q模减少以获得私钥。类似地,您使用SHA-512输出的后半部分来获取私有DH密钥