原文链接
https://www.codeproject.com/Articles/11578/Encryption-using-the-Win-Crypto-API
介绍
如今,信息技术的使用变得越来越复杂。进行和传输和存储的数据经常是分类的,且需要防止第三方读取。这个特别的问题的关键字是(从逻辑和物理上讲)“安全”。安全的一个部分是加密。人们通常认为安全仅仅是随后插入的东西,这是绝对不正确的。
当加密被包含在最终的产品的时候,其使用的经验法则可以被归纳为下面这几条:
1.不要依赖于算法本身的加密操作。
2.公开算法,但是密钥保持私有。
RSA 加密
如今,最有名的加密算法之一叫做”RSA 加密“。这种加密形式使用非对称密钥。这意味着如果你有第一个键,则无法评估第二个键,反之亦然。
RSA 是一个公钥加密系统,它通常使用两个算法(E,D),一个用来加密, 一个用来解密。使用者有两个密钥对,包含一个私钥(SK)和一个公钥(PK)。
CBC 模式
RSA 是一种典型的使用CBC(Clipher Block Chaining)的加密方式。这意味着被加密的信息被分成小块。每一个块使用XOR 操作符链接在一起,然后被加密。
使用CBC 模式操作的时候,需要所有的块都有同样的大小。如果最后一个块比其它的块小,此时有必要使用填充的方法使其大小保持一致。正式的,CBC 模式以一下方式操作,其中以y0开始,y0 是64位初始化向量。
解密时,整个操作只是逆转了。这意味着密码块被解密然后被异或。这样我们最终得到明文。
使用代码进行加解密
Win32 API 提供了一些可以提供加密功能的函数。使用系统提供的加密API 的好处是你不用再去寻找第三方的机密提供者,并研究它的安装和使用方法。缺点也比较明显,无法兼容其它的操作系统平台。
在执行任何操作之前,我们必须创建一个context。执行加密操作的时候将使用这个context 好几次,因此,直到加密操作完成,我们应该保持代表context 的句柄没有被关闭。
当我们得到了context,我们需要得到一个key,加密的时候我们需要使用这个key。key 可以从头创建也可以从文件中导入。下面的代码片段中,pbBlob(如果不为NULL)是从文件中取出的一个包含key 的二进制数据。
在存储key 的使用 PKCS#7 标准是不错的选择,本文附带的程序没有使用该标准。
导入或者创建key 之后就可以执行加密或者解密操作了。加密和解密操作是基于这个key的。
解密与加密并没有特别大的区别。与加密操作一样,只需一次调用即可将密文解密。
需要注意的地方
明文包含任何信息的文本/数据。在执行加密之前,最好将明文放入到一个无符号字符数组中以避免加密执行过程中可能导致的问题。