Windows/Apps/UWP/Develop/Security/Cryptographic keys
Symmetric keys
对称加密是指加密和解密的过程采用同一个密钥。WinRT中的SymmetricKeyAlgorithmProivder可以提供不同算法的对称加密密钥。具体加解密的工作则是由CryptographicEngine完成的。
对称加密通常采用分块操作。也就是算法的输入是一块固定大小的明文,输出则是一块固定大小的密文。同一种加密算法通常可以有不同的分块操作模式:
- ECB(electronic codebok)对每个分块进行单独的加解密。这种特性导致ECB的安全性不是很高。
- CBC(cipher block chaining)则用前序的分块对当前的分块进行混淆操作。然而,对于第一分块没有前序分块,所以需要用户提供用于混淆的数据(IV,initialization vector)
- CCM(counter with CBC-MAC) 基于CBC模式,但是可以提供一个消息辨伪码(MAC,message authentication mode)用于对密文进行辨伪。
- GCM(Galois counter mode)基于CCM,但是采用Galois辩伪模式。
对于需要输入IV的算法,如CBC,可以在嗲用CryptographicEngine.Encrypt的时候传入IV。IV在使用上,有以下注意事项:
- 如果重复使用同一个IV多遍,会增加破绽
- 可以使用Counter来改变每次使用的IV
- 可以使用CryptographicBuffer.GenerateRandom来创建IV
- 可以使用Nonce来创建IV
很多操作模式要求明文是分块的整数倍大小,如果达不到的话需要对明文进行填充操作。
除了分块加密之外,还有流式加密。流式加密通过在明文比特流上应用伪随机比特流(key stream)来生成密文。一些分块加密模式,比如OTF(output feedback mode)、CTR(counter mode)可以把分块加密变成流式加密。但真正的流式加密要输RC4,所以其操作速度也更快。
Asymmetric keys
非对称加密意味着加密和解密采用的是不同的密钥。一般通过非对称算法,生成一对互相关联的公钥和私钥。公钥加密的数据可以用私钥解密,私钥加密的数据可以用公钥解密。使用AsymmetricKeyAlgorithmProvider可以生成非对称加密算法。非对称加密一般操作速度比对称加密要慢,所以不用于处理大数据量。
下面是非对称加密的一个应用场景:
- Alice要求Blob发信息给她的时候必须加密信息
- Alice创建一个公钥私钥对,并把公钥散发出去给Blob,私钥则自己藏好
- 如果Blob有一个信息要发给Alice,他会创建一个对称密钥,然后用对称密钥加密信息
- 接着Blob用Alice的公钥来加密这个对称密钥
- Blob将加密过的信息和对称密钥都发给Alice
- Alice用自己的私钥解开对称密钥,然后再用获取到的对称密钥解密信息
Deriving keys
有时候需要从一个共享的密钥中派生出额外的密钥,可以使用KeyDerivationAlgorithmProvider 并搭配任意一个特定方法来生成的KeyDerivationParameters:
- BuildForPbkdf2,用于 PBKDF2(password-based key derivation function 2)
- BuildForSP800108 ,用于counter 模式或者HMAC(基于哈希的MAC)
- BuildForSP80056a,用于SP800-56A
其他
- How to choose an AES encryption mode (CBC ECB CTR OCB CFB)?
- UWP: AES encryption and decryption
- AES vs. DES Encryption: Why Advanced Encryption Standard (AES) has replaced DES, 3DES and TDEA
- Authenticated encryption
- AES-GCM recommended IV size: Why 12 bytes?
- Galois/Counter Mode
(本篇完)