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

其他

(本篇完)