Ali*_*Ali 5 .net c# encryption algorithm cryptography
我想使用非对称加密算法,但我需要它有短的密钥大小(不像RSA,至少384).我需要它大约20左右.有可能吗?
有多种方法可以实现短密钥大小。
\n\n1.使用RSA
\n\nRSA 公钥由一个大数n(“模数”)和一个(通常很小)数e(公共指数)组成。e可以小到 3,并且在封闭设置(您控制密钥生成)中,您可以强制使用传统的e,对每个人都一样。n的典型大小是 1024 位(即 128 字节)。
\n\nn是两个素数的乘积 ( n = p*q )。了解p和q足以重建私钥(名义上是值d ,它是e模p-1和q-1的乘法逆元)。假设n已知,仅了解p就足够了(如果您知道n和p,则可以通过简单的除法计算q )。为了适当的安全性,p和q应该具有相似的大小,因此即使采用两者中较小的一个,您仍然需要存储大约 512 位左右(即 64 字节)。
\n\n还建议选择较小的d(“私有指数”)。但这使得e本质上是随机的,因此很大;您不能再对e使用传统的小值。这基本上使公钥大小加倍。此外,强制使用较小的d可能会使密钥变弱(已经证明,当d的大小不超过n大小的 29%时就会出现这种情况,但这并不能以任何方式证明 d为30 % n的大小是安全的)。这通常被认为是一个坏主意。
\n\n2. 使用 DSA/Diffie-Hellman
\n\nDSA 是一种数字签名算法。Diffie-Hellman 是一种密钥交换算法。两者都是“非对称加密算法”,您可以根据需要使用其中之一或两者。在这两种情况下,都有一个公共数学群(对于基本 DSA 和 DH,以大素数p为模的数字;椭圆曲线变体使用椭圆曲线作为群);公钥是群元素,私钥是该元素相对于传统生成器的离散对数。换句话说,给出了一个素数p和一个模p的数g(它们可以被所有密钥持有者共享,甚至);私钥是与公钥y = g x mod p相对应的数字x。私钥是以一个小素数q为模来选择的。q是已知的,并且必须足够大,以便击败通用离散对数算法;实际上,我们需要 160 位或更多的q。
\n\n这意味着私钥大约有 20 个字节。这不是 20 位十进制数字,但更接近。
\n\n3. 使用任何加密算法
\n\n当您生成密钥对时,您可以使用以下命令:
\n\n例如,使用 RSA,您可以通过创建适当大小的随机奇数并循环直到找到素数来生成p和q 。对于给定的随机源,整个过程是确定性的:给定相同的随机位,这将找到相同的素数p和q。
\n\n因此,您可以开发一个由秘密密钥K播种的 PRNG ,并将其用作密钥生成过程的随机源。每当您需要私钥时,您都可以使用K作为输入再次运行密钥生成过程。瞧\xc3\xa0!您需要存储的私钥现在是K。
\n\n对于 RSA,这使得私钥的使用相当昂贵(RSA 密钥生成并不容易)。然而,对于 DSA / Diffie-Hellman,这将非常便宜:私钥只是一个随机数模q(群阶)为模的随机数,生成它的成本比使用私钥进行数字签名或非对称签名要低得多。密钥交换。
\n\n这导致以下过程:
\n\n密钥生成有轻微偏差,但这并不意味着有太大的安全问题。请注意,如果您需要 DSA 密钥和DH 密钥,则可以使用同一组,但不应使用相同的私钥(因此使用 SHA-512 输出的两半)。
\n\nK应该有多大?对于 SHA-512 等哈希函数,K可以是任意任意位序列。然而,K应该足够宽以击败穷举搜索。1024 位 RSA 密钥或 1024 位 DSA 模数( DSA 的p模数)提供的安全级别大致相当于 80 位对称密钥。类似地,DSA/DH 的 160 位组顺序提供相同的级别。80 位并不算多;如果你想被认真对待,你就不能低于这个标准。这意味着K应该在至少有2 80个可能的键的空间中选择;换句话说,如果K被选为均匀随机字节,那么它的长度必须至少为10个字节。对于十进制数字,您至少需要 24 位数字。任何低于这个值的东西本质上都是弱的,这是不可避免的。
\n\n标准警告:如果上述任何内容对您来说不明显或不清楚,那么就不要考虑实施它。加密算法的实现很棘手,特别是因为无法测试最致命的错误(并不是因为程序运行并且看起来工作正常,所以它不包含安全漏洞)。
\n| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |