The Cryptography API, or How to Keep a Secret
译注:因本文发布时间较早,文中所阐述某些内容已发生变化,发生变化处译者已标出。
Robert Coleridge
Microsoft Developer Network Technology Group
August 19, 1996
摘要
本文描述已在新的Windows NT 4.0版本和即将在Windows 95之后版本中发布的微软加密应用程序接口 (Microsoft Cryptography application programming interface)。 本文检验了为安装并使用这些新的 API需要具备的条件。 为了完成例程的编译,你需要 Microsoft Visual C++ 4.2或以后版本及Windows NT 4.0或以后版本.
注 部分加密算法 API处在美国政府出口限制下。(译注:美国政府对强加密产品的出口限制已撤消)
下载例程http://download.microsoft.com/download/win95/api-samp/1.0/WIN98MeXP/EN-US/5003.exe
简介
加密 API在企业计算模型(Enterprise Computing Model)中有着重要的应用。企业计算化程度意味着人的接触更全球化,例如国际商品贸易,州际库存管理等等。在这些领域中经常要通过不安全渠道传输敏感信息—例如电传合同,通过电子邮件收发订单,及种种其它情况。使用加密API(Cryptography API),你就能够保证信息的安全性。
本文使用CRYPTOAPI例程来演示如何加密、解密数据(decrypt or encrypt data),对文件签名、验证签名(sign and verify files),及增加、删除用户(add and remove users)。
加密API总览
加密服务提供者模块(Cryptography Service Provider――CSP)
[编者注:文章中部分内容直接取材于平台SDK(Platform SDK)的CryptoAPI文章。这些部分的段落已缩进(所有段落左对齐), 但没以数字、项目符号或“注意:”引导,因此你应该能容易的辨认出来]
当对用户的私有敏感数据提供保护时,加密API中的函数允许应用程序以一种灵活的方式来加密或者电子签名数据。所有加密操作都由独立的模块来实施,这些模块叫作加密服务提供者(cryptographic service provider)。操作系统中已经包含了一个CSP,名叫“Microsoft RSA Base Provider”。
每个CSP都对加密API层提供一个不同的实现。一些提供强加密算法,而另一些会包含如智能卡(smartcards,智能卡是一张嵌有包含用户安全信息芯片的塑料卡片)之类的硬件部件。另外,一些CSP可能会直接与用户交互,如使用用户的签名私鈅进行数据签名时。
应用程序不要使用依赖于特定CSP的属性。例如,“Microsoft RSA Base Provider”目前使用40位的会话密鈅(session keys)和512位的公鈅(public keys) (参阅 "Symmetric Versus Public-Key Encryption," MSDN Library, Platform, SDK, DDK 文档)。当程序维护这些的时候,要小心的不要假定需要使用多大的内存去存储它们。另外,当用户在系统中安装一个不同的CSP后,程序很可能出错。你要努力使写出的程序尽可能的well-behaved and flexible(行为良好且易扩展)。
密鈅库
每个CSP都有一个密鈅库(key database),里面存储着由CSP保存的算法密鈅。每个密鈅库都包含一个或多个密鈅容器(key container), 每个容器都包含所有属于特定用户(或使用加密API的客户端程序)的密鈅对。每个密鈅容器都被赋与一个唯一的名字,这个名字是程序要获得此容器句柄时传给函数CryptAcquireContext的参数。图1图解了密鈅容器中的内容:
图1 密鈅容器的内容
CSP在两次会话之间保存所有密鈅容器,包括所有属于它的公/私鈅对(public/private key pairs)。但会话密鈅在两次会话之间(session keys)不被保存。
尽管在计算机中可以找出这些密鈅来,但这些密鈅是以一种加密的安全格式保存的。
通常,会为每个用户创建一个默认的密鈅容器。这个密鈅容器是以用户的登录名来命名的,之后任何程序都可以使用它。应用程序自己也可以创建自己的密鈅容器和密鈅对,应用可以自己起名。
密鈅
会话密鈅
会话密鈅被用在加密和解密数据时。应用使用 CryptGenKey 或者CryptDeriveKey 函数来创建它。CSP将密鈅安全的保存在内部。
与密鈅对不同,会话密鈅是可变的。应用可以将密鈅保存下来以备后用或者用CryptExportKey函数以加密的密鈅二进制大对象或密鈅blob(key binary large object or key blob)形式将密鈅导出到应用中,然后传输给其它人。
公鈅、私鈅对
每个用户通常都有两对公鈅/私鈅对。一对用于加密会话密鈅,另一对用于创建数字签名。它们分别叫做密鈅交换( key exchange )密鈅对与签名(signature)密鈅对。
注意,尽管大多数CSP创建的密鈅容器会包含两对密鈅对,但这不是必须的。一些CSP根本不存储密鈅对,而另一些会存储额外的。