计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第10期 Vol.25 No.10 1999



面向对象的信息安全引擎工具包
朱森存　荆继武　王家业
摘要：综合介绍了国际上目前的密码学API（工具包）发展的现状，分析了它们的优缺点。并利用面向对象技术实现了一个接口简单、符合密码学概念的信息安全引擎工具包。
关键词：CSADE；密码学API；面向对象
Object-oriented Cryptography Engine Toolkit
Zhu Senucn Jing Jiwu Wang Jiaye
(State Key Laboratory of Information Security of USTC,Beijing 100039)
【Abstract】This article introduces the development of cryptography API,then analyses their characteristics.Besides,we use object-oriented technology to implement a cryptograhpy toolkit which has much simpler interfaces and is consistent with the conception of cryptography.
【Key words】CSAFE;Crptograpy API(Toolkit);Object-oriented
　　密码学API是一种密码学应用程序接口，使用这种接口，普通程序员就能够开发出安全的应用程序或产品，而无需太多密码学、数学或数论方面的背景知识。随着密码学理论与技术的日益成熟及近年来Internet的飞速发展，人们对安全的需求也越来越大,因此，提供一种使用和理解都非常简单的安全引擎工具包或接口成为大势所趋。目前国际上已经制定出了一些相关的行业标准并开发出了部分产品。国际互连网络工程任务组织IETF制定了"通用的安全服务应用程序接口GSS-API"，这是有关安全产品应用开发接口的第一个国际标准。该标准现已成为高层应用系统在互连网络中申请和提供不同的安全服务的比较成熟的统一标准接口。另外，国外的一些实力雄厚的大公司和研究机构也纷纷推出了与密码学相关的安全引擎或编程接口。其中最为著名的有美国惠普公司提出的ICF(International Cryptography Framework)，美国微软公司推出的CAPI以及美国RSA公司推出的BSAFE。ICF是一个旨在满足全球应用密码学安全服务的解决方案，而CAPI和BSAFE则是安全服务的应用编程接口产品。另外，美国IBM公司，Intel公司，德国的GMD，都推出了与密码学相关的安全产品。
1　目前安全API局限性
　　上述的各种安全API或工具包，由于其开发的目标不一致，各有各的侧重，因此各自有自己的优点和局限。像IEFT的GSS-API,其优点是提供了一套安全且通用的接口，但是，由于GSS-API只提供端到端的会话，因此在建立安全会话之前，必须知道通信对方。这就限制了GSS-API在许多方面的应用。比如在新闻组中参与讨论，由于无须指定通信对方，如此将无法获得GSS-API的安全服务。
　　在分析各种API时，发现了它们共同的不足之处，那就是，API调用起来很复杂，表现在：
　　(1) 接口参数多。
　　(2) 接口参数数据类型复杂，大量使用C语言中的结构体，而且结构体中还嵌套着结构。
　　观察GSS-API的初始化函数(见RFC1509)：
　　OM_uint32 gss_init_sec_context (OM_uint32 *minor_status,
　　　　　　　gss_cred_id_t　　claimant_cred_handle,
　　　　　　　…………………
　　　　　　　OM_uint32　　　　*time_rec
　　　　　　　);
　　其参数个数为13个，每个参数数据类型都是一个复杂的结构体。这种接口，只能让用户望而怯步。
　　(3) 操作过程繁杂。一些过程，如加密，在密码理论上只需一步就能实现，而实际上则还需很多辅助步骤。以BSAFE的一次RC4加密为例，其过程是：创造算法对象(一个复杂的结构体)→设置算法对象→初始化工作，包括创造密钥对象，设置密钥对象(另一个复杂的ITEM的结构体)→更新工作,进行中间数据块的加密→结束工作，进行最后一块数据的填充和加密→破坏所分配的内存空间.从编程角度来说，其中每一步都是合理的，但是对普通用户来说，要想很快且清楚地理解和使用却是非常困难的。
　　上面所举的加密例子，其实只是最简单的密码学操作，对于那些复杂的操作，如数字签名，证书生成等，其过程更是繁杂无比。大家知道，对称算法的操作模式主要有4种，分别是：ECB，CBC，CFB，OFB。这样，每当用户使用DES算法时，必须选择一种模式，如果他们选择了CBC模式，则还必须设置初始化矢量(IV)，指定数据块填充方式，而且通信对方也必须知道这些设置，否则就无法正确地解开明文数据来。另外，由于现在的密码学算法非常的多，每个使用的方法都不一样，因此大大增加了实现的复杂度。
2　 我们的解决方案－CSAFE
　　那么，怎样才能较好地解决上述的困难，又能全面地提供密码学服务？
　　我们的设计思想和方法是:整个系统采用面向对象的设计方法。而BSAFE，Crypto-API,GSS-API等，都是采用过程描述式的结构化程序设计方法，相对而言，面向对象的设计方法增加了软件的可重用性和可扩充性，从而改善并提高了应用开发人员的生产效率，同时能够有效地控制软件的复杂度，减少软件维护的工作量。CSAFE绝大部分采用C++语言来进行代码设计。C++是C的超集，不仅保留了C语言简洁和高效的优点，还充分利用C++语言的封装和继承特性，使得API的接口尽可能地简化，从而克服了那繁杂的操作过程和令人生畏的接口参数。
　　因此，CSAFE相对于其它密码学API来说，具有如下特点：
　　首先，CSAFE 整体结构模型简单。
　　在图1中，CSAFE的最底层是大整数算法引擎，快速算法引擎和硬件接口。最上层是用户接口，它提供大整数算法引擎、编程和编码三方面的功能接口，一般用户无需了解底下的几层，除非需要自定义算法，这时需要对快速算法引擎提供的接口有所了解。模型中的编程接口提供密码学操作，如加密和解密等功能，编码接口根据国际标准来编码和解码数据。

图1 CSAFE结构模型
　　其次，提供的安全引擎工具包接口和操作过程都非常简单，程序接口和功能符合密码学概念。利用C++语言的封装特性，把密钥等数据封装起来，这样既有利于保护敏感数据，又大大减少了接口参数。采用的参数的数据类型都是最基本的，如整型、字符串等，且每个参数的意义符合密码学概念。如在加密时，其方法参数为：明文(字符串)，明文长度(整型)，密文(字符串)。函数返回密文的长度，这与密码学上的加密过程是完全一致的。考虑到不同用户的水平和要求，提供了默认的典型算法和操作模式，当然熟练的用户可以在提供的算法库中自由地选择自己所需的算法。
　　另外，CSAFE中算法是可替换的。采用C++的纯虚函数，在基类中留下算法接口。由此派生出几种典型的算法，用户可以自由选择使用。但如果用户需要使用自己编制的密码学算法，那么所需的工作只是从算法接口中派生出自己的算法，就能完全使用基类所提供的丰富的方法和数据，这是普通的程序员就能胜任的，而新算法和原有算法的调用方法是完全一样的。
　　CSAFE还提供一定的数学工具。利用了C++语言的可重载特性，重载了一些基本的数学运算。如重载了大整数计算，用户就可以用普通的运算符号，如加减乘除、乘方等，进行大整数运算。
　　CSAFE还有其它一些长处。所有的类都从一个提供错误代码和原因的类中派生出来，这样当程序运行结果与理论上不一致时，就可很方便地查到原因。这在很大程度上增强了代码的可维护性，有助于模块化设计的实现。
　　下面通过一个利用RSA算法来加解密的例子，具体说明如何实现上述思想的。在这个例子中，假定了通信双方Alice和Bob,他们要通过RSA算法来传输数据(假定事先不知道对方的密钥)。
　　其具体通信过程如下：
　　(1)Alice产生RSA私钥对象a.　　　　　　DCS_RSA_PRIVATE a;
　　　 Bob 产生RSA公钥对象b.　　　　　 　DCS_RSA_PUBLIC b;
　　(2)Alice产生1024bit的RSA公私钥对　　a.GenerateRSAKey(1024);
　　(3)Alice把自己的公钥信息编码后输出　　i=a.OutputPublicKey(pk);式中pk为编码后的公钥信息(根据PKCS标准),i为pk的长度。
　　(4)Bob在得到Alice的编码的公钥信息后
　　　通过Restore操作得到Alice的公钥　　　b.RestorePublicKey(pk,i);
　　(5)Bob用Alice的公钥加密一段明文数据得到的密文数据输出。
　　clen=b.DoEncryptWithPublicKey(pout,pin,plen);
　　式中pin为明文数据，plen为明文数据长度，cout为密文数据，clen为密文长度
　　(6)Alice用自己的私钥解开Bob传来的密文，得到明文数据
　　plen=a.DoDecryptWithPrivateKey(pout,cin,clen);
　　式中pout为明文数据，plen为明文数据长度，cin为密文数据，clen为密文长度
　　(7)一次通信结束
　　　(注：例中所有的函数接口参数数据类型为字符串型或整型)
3　总结和努力方向
　　采用面向对象的设计方法，CSAFE成功地解决了前文指出的目前密码学API的局限性。SAFE提供的基本功能有：随机数产生；素数校验,加解密,MAC生成和校验；数字签名；大整数运算等。另外，CSAFE还提供了许多综合功能，包括：秘密共享方案，密钥管理，证书管理等。
　　由于CSAFE提供众多的功能，因此它可以广泛应用于电子货币及电子商务；基于TCP/IP协议的网络安全通信；安全的电子邮件；证书授权服务器(CA)；防火墙；虚拟安全网络；语音与图形图象加密；数据库加密，以及其它安全领域。
　　当然，作为一种工程上的应用工具，它不可能是完美无缺的。一方面，它需要不断地扩充功能，提供更多的算法。另外，它应该可以适应更多的应用平台，虽然目前它已可运行于Win95/NT, Sco Unix平台。将在以后的工作中逐步地完善它。
基金项目：中科院重大课题（已通过部级鉴定）
作者简介：朱森存（1974～），男，研究生，主攻密码学应用
作者单位：中国科技大学信息安全国家重点实验室，北京100039
参考文献
1 Schneier B.Applied Cryptography.John Wiley&Sons,Inc.1994
2 美国RSA公司产品BSAFE 2.0用户手册
3 RFC,IETF,ITU,PKCS系列等
收稿日期：1999-02-02
