本文介绍如何使用标准密钥派生函数来派生密钥,以及如何使用对称和非对称密钥加密内容。
对称密钥
对称密钥加密(也称为密钥加密)要求用于加密的密钥也用于解密。 可以使用 SymmetricKeyAlgorithmProvider 类指定对称算法并创建或导入密钥。 可以使用 CryptographicEngine 类上的静态方法通过算法和密钥来加密和解密数据。
对称密钥加密通常使用块密码和块密码模式。 块密码是一个对称加密函数,用于对固定大小块进行操作。 如果要加密的消息长度超过块长度,则必须使用块密码模式。 块密码模式是使用块密码生成的对称加密函数。 它将纯文本加密为一系列固定大小块。 应用支持以下模式:
- ECB(电子代码示例)模式单独加密消息的每个块。 这不被视为安全加密模式。
- CBC(密文块链接)模式使用先前的密文块来混淆当前块。 您必须确定要用于第一个区块的值。 此值称为初始化向量(IV)。
- CCM 模式(计数器与 CBC-MAC)将 CBC 块密码模式与消息认证码(MAC)结合在一起。
- GCM (Galois 计数器模式)模式将计数器加密模式与 Galois 身份验证模式相结合。
某些模式(如 CBC)要求对第一个密码文本块使用初始化向量(IV)。 以下是常见的初始化向量。 调用 CryptographicEngine.Encrypt 时指定 IV。 在大多数情况下,重要的是决不能使用同一密钥重复使用 IV。
- 已修复对所有要加密的消息使用相同的 IV。 不推荐使用会泄漏信息的东西。
- 计数器递增每个块的 IV。
- 随机创建伪随机 IV。 可以使用 CryptographicBuffer.GenerateRandom 创建 IV。
- Nonce-Generated 对要加密的每个消息使用唯一编号。 通常,nonce 是经过修改的消息或事务标识符。 nonce 不必保密,但不应在同一密钥下重复使用。
大多数模式要求纯文本的长度正好是块大小的倍数。 通常,这需要对纯文本进行填充,以获得合适的长度。
虽然块加密加密固定大小的数据块,但流加密器是对称加密函数,可将纯文本位与伪随机位流(称为密钥流)组合在一起,以生成密码文本。 某些块密码模式(如输出反馈模式(OTF)和计数器模式(CTR)有效地将块密码转换为流密码。 但是,RC4 等实际流加密器通常能够以比块密码模式更高的速度运行。
以下示例演示如何使用 SymmetricKeyAlgorithmProvider 类创建对称密钥,并使用它来加密和解密数据。
非对称密钥
非对称密钥加密(也称为公钥加密)使用公钥和私钥来执行加密和解密。 密钥不同,但在数学上是相关的。 通常私钥是保密的,用于解密数据,而公钥则分发给相关方,并用于加密数据。 非对称加密也可用于对数据进行签名。
由于非对称加密比对称加密慢得多,因此很少用于直接加密大量数据。 相反,它通常以以下方式用于加密密钥。
- Alice 要求 Bob 发送她唯一加密的消息。
- Alice 创建一个私钥/公钥对,保留她的私钥机密并发布她的公钥。
- 鲍勃有一条他想发送给 Alice 的消息。
- Bob 创建对称密钥。
- Bob 使用他的新对称密钥将消息加密给 Alice。
- Bob 使用 Alice 的公钥对对称密钥进行加密。
- Bob 将加密的消息和加密的对称密钥发送到 Alice(信封)。
- Alice 使用她的私钥(从专用/公共对)解密 Bob 的对称密钥。
- Alice 使用 Bob 的对称密钥解密消息。
可以使用 AsymmetricKeyAlgorithmProvider 对象指定非对称算法或签名算法、创建或导入临时密钥对,或导入密钥对的公钥部分。
派生密钥
通常需要从共享机密派生其他密钥。 可以使用 KeyDerivationAlgorithmProvider 类和 KeyDerivationParameters 类中的以下专用方法之一来派生密钥。
| 对象 | 说明 |
|---|---|
| BuildForPbkdf2 | 创建 KeyDerivationParameters 对象,以便在基于密码的密钥派生函数 2(PBKDF2)中使用。 |
| BuildForSP800108 | 创建一个 KeyDerivationParameters 对象,用于在计数器模式下使用基于哈希的消息身份验证码(HMAC)的密钥派生函数。 |
| BuildForSP80056a | 创建用于 SP800-56A 密钥派生函数的 KeyDerivationParameters 对象。 |