在密码学中,我们通过使用特定密钥加密消息然后通过网络发送来保护消息。加密的安全性通常取决于密钥长度。在本文中,我将阐述为什么密钥长度是密码学中一个非常重要要素。
密钥长度(又名密钥大小)是用于加密消息的密钥的位数。长度本身并不能衡量密文的安全性。但是,对于安全密码,密钥越长加密越强。
在密码学中,我们可以使用对称或非对称两种算法让我们根据它们在这两种算法上的使用来划分我们的密钥大小分析。
为什么密钥大小在密码学中很重要?
密码的安全性并不取决于攻击者不知道用于加密的算法。安全性取决于在数学上破解代码的难度。
对密码的攻击主要有两种类型:暴力破解和密码分析。
让我们分析一下密钥大小对暴力攻击的影响。
暴力攻击中的密钥大小影响
在蛮力攻击中,攻击者将生成所有可能的密钥并尝试每个密钥,直到成功。因此,可能的密钥越多越好。
例如,凯撒密码是一种替换/移位密码,它将普通消息中的每个字母替换为后面 n 个位置的字母。n 被称为移位或键。例如,如果键是 3,则 'a' 将替换为 'd',因为 'd' 在字母表中位于 'a' 之后的三个位置。
因为字母表有 26 个字母,所以只有 26 个可能的密钥可用于此密码。因此,如果您知道如何读取已加密的文本,则很容易尝试所有密钥并破解代码。
其他密码使用特定长度的密钥,例如 128 位。位是计算机中使用的基本单位,只能有两个值,1 或 0。
那么,如果我们使用 128 位,我们可以有多少个密钥,并且每个位可以有两个值?这是一个经典的计数问题。
我们可以用 2 种方式选择第一个位,第二个也可以用两种方式选择,依此类推,直到最后一个。在这里,我们应用乘法规则来计算总路数。
2 x 2 x 2 x … x 2 = 2^128 = 340282366920938463463374607431768211456L
这是一个相当长的数字。
因为在我们当前的计算机中计算先前的密钥数量在计算上是不可行的,所以必须尝试所有可能的密钥的蛮力攻击是不切实际的。
加密算法的安全级别
密码的安全级别被认为是衡量某种算法强度的指标,以“比特(BIT)”为单位。
64 位安全算法意味着攻击者必须执行 2^64 次操作才能破解加密。
如果算法至少是 112 位安全的,则它们被认为是安全的。
对称密码学中的密钥
对称加密的当前标准是高级加密标准 (AES) 算法。
AES 是一种分组密码。
批准为 AES 安全的密钥大小为 128、192 和 512 位。
非对称密码学中的密钥
非对称加密密钥强度基于整数分解的复杂性。这个问题很难解决(它需要很多时间),但它比蛮力攻击花费的时间更少。出于这个原因,非对称加密算法需要更长的密钥大小才能具有与对称加密算法相似的安全级别。
批准使用 AES 的密钥大小为 128、192 和 256。
对于 RSA,NIST 推荐的密钥大小至少为 2048 位。
椭圆曲线密码学 (ECC) 算法家族已被证明可以以较小的密钥大小实现类似的安全级别。
公钥有多长?
公钥的长度取决于所使用的算法。在下表中查找公钥的可能密钥长度。
算法 | 密钥大小 |
RSA | 1024, 2048, 4096 |
椭圆曲线 | 256, 384, 512 |
迪菲-赫尔曼 | 2048 |
埃尔加马尔 | 1024 |
根据所选算法的公钥长度根据您需要的安全级别,建议使用什么密钥大小。
例如,自 2015 年以来,NIST 建议在使用 RSA 时使用 2048 位密钥大小。在此之前,建议的密钥大小为 1024。
为什么会这样?
每一天,随着技术的发展,计算机获得了更多的处理能力,使过去的困难变得更加容易。此外,还发现了新的数学方法和工具。它们都会影响加密协议推荐的有效期。
通常,关于如何破解某些密码的理论被发现和发表。尽管由于缺乏所需的计算能力,它们目前可能不实用,但它们揭示了可能存在的漏洞。然后,对算法进行改进,因此它们不会变得不安全。
其中一项改进是建议使用更长的密钥,就像 RSA 一样。
推荐算法和密钥长度
在下表中查找不同算法的推荐密钥大小。
算法 | 推荐的密钥大小 |
AES | 128 |
RSA | 2048, 3072, 7680 |
椭圆曲线 | 256, 384 |
动态搜索广告 | 2048, 3072, 6770 |
迪菲-赫尔曼 | 2048, 3072, 6770 |
最常用加密算法的推荐密钥大小在某些情况下,建议使用密钥大小等于或大于 192 的 AES。因此,请务必查看与某些信息安全策略相关的规定。
上表中的所有算法都是安全的。因此,密钥大小越大,安全性越强。
对称和非对称算法的安全等级比较
在下面找到对称和非对称算法的安全级别和密钥大小的比较。
在 DSA 和 Diffie-Hellman 算法的情况下,L 表示公钥的大小,N 是私钥的大小。
安全强度 | 对称密钥算法 | DSA,迪菲-赫尔曼 | RSA | 椭圆曲线 |
80 | 2TDEA | L=1024 N=160 | 1024 | 160-223 |
112 | 3TDEA | L=2048 N=224 | 2048 | 224-255 |
128 | AES-128 | L=3072 N=256 | 3072 | 256-383 |
192 | AES-192 | L=7680 N=384 | 7680 | 384-511 |
256 | AES-256 | L=15360 N=512 | 15360 | 512+ |
从上表可以看出,非对称算法需要更长的密钥才能保证与对称算法相同的安全级别。MOD8ID中的密钥生成和签名验签示例
加密芯片MOD8ID是一款支持全系列加密算法和安全协议栈的高集成加密芯片,我们可以很方便的使用MOD8ID进行密码算法的各种验证。
/* [0] init: I2C通信连接、测试(使用MOD8ID,I2C驱动移植请参考ecc_i2c.c) */
status = mse_init(&cfg_mod8_i2c);
if (status != MSE_SUCCESS)
{
printf(" mse_init() failed with ret=0x%08dn", status);
goto exit;
}
printf(" init OK.n");
/* [1] Load configuration:加载配置并锁定配置区(仅执行一次,注意:锁定后无法解锁) */
status = app_load_configuration();
if (status != MSE_SUCCESS)
{
printf(" APP - Load configuration failedn");
goto exit;
}
printf(" Load configuration OK.n");
/* [2] Write Slot Data:生成密钥、写入密钥及应用配套数据,锁定数据区(锁定后无法解锁),前置条件:[1] */
status = mod8id_genkey(cfg_mod8_i2c,key_id, public_key);
if (status != MSE_SUCCESS)
{
printf(" APP - mod8id_genkey failedn");
goto exit;
}
printf(" Write key OK.n");
/* [3] Sign_Verify: 签名、验签、加解密等应用,前置条件[2] */
status = app_sign_verify();
if (status != MSE_SUCCESS)
{
printf(" APP - Sign_Verify failedn");
goto exit;
}
printf(" Sign_Verify OK.n");
概括
作为总结,我们可以梳理以下关键点: