1、密码学的基本概念
数据加密或称数据编码就是给定初始值利用某种算法把明码文本转换成一种编码文件,编码文件只有通过解码之后才能阅读。数据加密的实现手段则称为加密技术或编码技术。给定的初始值也称为密钥。根据密钥的特点,密码体制分为对称和非对称密码体制。
对称密码体制也称私钥或传统密码体制,微软密码接口技术中也称会话密钥(Session Key)。该体制中加密密钥和解密密钥是一样的,其算法快,但需要找到一种安全传送密钥的通道。非对称密钥体制也称双钥或公钥密码体制,该体制中加密密钥和解密密钥是不一样的。每个用户都有两把密钥:加密密钥和解密密钥。其中加密密钥公开,解密密钥由自己保存。用户A若要向B发送明文,只要利用B的公开密钥对明文加密。而B收到密文后利用只有他掌握的解密密钥解密就可得到明文。其中私钥密码体制根据对明文加密方式的不同可分为流密码和分组密码。流密码算法利用密钥流的第i个元素对明文的第i个字符加密。分组密码算法则将明文分成n组有m个字符的数组,每组明文在同一个密钥流的控制下变换成p个字符的密文组。由于两种体制下算法复杂度不同,在软件实现中,私钥流密码DES(数据加密标准)大约比公钥RSA(1977年由Rivest、Shamir和Adleman提出)算法快100倍。
数字签名是公钥密码体制下的一个重要应用。数字签名是绑定在明码上的一段消息串,其表现手段不同于手写签名或印签,但它们的作用基本一致。即都能保证明码发送后的完整性和验证签名者。应用RSA公钥体制进行数字签名时,若A要向B送去信息m,A可用A保密的解密密钥DA对m进行加密得到DA(m),再用B的公开密钥EB对DA(m)进行加密得最终密文,B收到密文后先用他自己掌握的解密密钥DB对密文进行解密得到中间密文DA(m),再用A的公开密钥EA对中间密文DA解密得到明文。由于最终密文只有A才能产生,B无法伪造或修改密文,所以A不能抵赖,这样达到签名认证的目的。
2、密码应用编程接口编程模式与微软密码系统
2.1 密码应用编程接口编程模式
密码应用编程接口工作模式类似于Windows图形设备接口GDI工作模式。密码应用编程接口提供了一组独立于密码服务提供商(Cryptographic Service Provider)的标准密码指令集,在应用程序与密码服务提供商之间提供一个环境外壳,负责应用程序的密码服务要求与执行密码应用程序系统中的密码功能之间的转换。所有加密操作均由密码服务提供商来完成,包括加密数据或数字签名和用户私钥保护等。密码服务提供商与图形设备驱动程序类似,是可根据需要进行增删的独立模块。密码应用编程接口的外壳模式将应用程序分隔成了用户态与核心态。应用程序在用户态下禁止直接与密码服务提供商通信,而是交给作为操作系统部分的密码应用编程接口核来完成。
2.2 微软信息密码系统
微软信息密码系统结构由三部分组成,它们分别是密码应用程序、操作系统和密码服务提供商(CSP)。如图1所示。
[img]20064412143392016.gif[/img]
图1 微软信息密码系统体系结构
图中密码服务提供商是真正完成密码工作的独立模块。理想的CSP应完全独立于具体应用程序,这样任何给定应用能运行在多种CSP上。一种CSP最少由动态连接库和签名文件组成。签名文件保证操作系统识别CSP。操作系统定期认证签名确保CSP没被篡改过。而动态连接库中包含了一系列密码服务程序的具体实现。例如微软RSA基本服务提供商提供的动态库文件为RSABASE.DLL和一个签名文件,它是和视窗操作系统绑定在一起的。当安装新的CSP时,服务提供商的安装文件将自动修改系统的配置文件,同时该CSP的密码应用编程接口的配置信息将存储在注册表的本地机器位置。每一个密码服务提供商都负责管理自己的密钥库,该密钥库可作为CSP为每个用户创建的永久性密钥的仓库。每个密钥库可有一个或多个存储特定用户所有密钥对的密钥容器(container)。绝大多数的CSP通常为用户提供两组公钥/私钥对。一组密钥对又叫密钥交换对,通常用于加密会话密钥,这样会话密钥可以安全存放或与其它用户交换。另一组又叫数字签名密钥对,通常用于创建数字签名。在用户与服务提供商建立联系之前,用户必须有一个密钥库,该密钥库存储在注册表的当前用户位置。操作系统成功安装某种CSP并创建密钥库后,就可以与应用程序取得连接。应用程序通过CSP名称调用CSP联系指令。一旦连接成功,由操作系统将CSP装入内存,其密码服务功能将成为操作系统核部分运行。
3、信息密码面向对象编程接口设计与应用
3.1 信息密码面向对象编程接口设计
应用面向对象方法,对密码编程接口功能进行分析与封装设计,将有效提高编程速度。信息密码功能主要包括:l)创建密钥。该功能根据提供的密钥算法产生私钥体制下的会话密钥或公钥体制下的公共/私钥对。2)交换密钥。该功能包括交换公钥和交换会话密钥。交换公钥不需要加密可直接输出。交换会话密钥时必须通过对方的公钥进行加密输出。3)数据加密和数据解密。由于非对称加密算法速度慢,信息密码面向对象编程接口中的所有数据加密都使用对称算法。而公共/私人密钥算法则用以较少位数的数据加密,如对会话密钥或数字签名进行加密。数据解密利用会话密钥对密文解密。4)数字签名和签名认证。数字签名可用来验证数据是否是真正由签名方发送来的或数据在途中是否受到损坏。创建数字签名的第一步是计算签名数据的哈希值,然后用用户的私钥加密哈希值得到数字签名。由于私钥是秘密的,可以确保不知道密钥的人无法伪造数字签名。签名认证第一步用用户的公共密钥解密数字签名并计算哈希值,将收到的哈希值与自己计算的哈希值相比较来验证数字签名,由于只有真正的发送者才能创建匹配的哈希值,所以可以认证发送者的身份。在信息密码面向对象编程接口实现中,创建密码类,将上述四种密码功能作为该类的成员函数。密码类既可作成基类与应用程序一起进行编译,也可作为窗口类的派生类,将密码类作成动态库由应用程序调用。下面是采用第二种方法列出的密码类C++语言描述:
Class CCryptography::CWnd
{
public:
CString strSourceFile,
CString strDestFile,
CString strDescription;
public:
CCryptography::CCryptgraphy(Cstring
sourcefile, Cstring destfile);
BOOL CreateKeyContainer( ); //创建密钥库
BOOL EncryptFile( ); //密码文件
BOOL DecryptFile( ); //解密文件
BOOL SignaturetFile( ); //创建数字签名
BOOL VerifyFile( ); //验证数字签名
}
3.2 密码类在柔性加工单元信息安全中的应用
柔性加工单元是有多品种小批量生产特点的制造系统。单元通常按照客户定单组织生产。单元网络环境加快了单元与外界交互信息的速度,同时也带来了网络信息安全问题。柔性加工单元网络信息安全包括:1)交互信息加密。加工单元通过网上发布服务信息和表单的方式与客户取得联系。双方交互具有许多不希望第三方知道的敏感信息,如客户方要求的定货名称、数量和单位等信息,加工单元回复的产品设计、成本报价等信息;2)合同数字签名。加工单元与客户双方利用网络签定合同时,传统的手写签名或印签方法是不适用的。这时需要借助数字签名方法达到手写签名的不可否认、无法伪造和可仲裁的目的。下面是应用密码类密码应用程序的部分C++代码:
文件加密
{//定义密码类对象,调用密码类加密成员函数
...
CCryptography* m_crypto;
m_crypto=new
CCryptography(Sourcefile, Destfile);
m_crypto->EncryptFile( );
...
}
4、全文总结
应用密码类编写密码应用程序明显提高了编程效率,而且也适应渐趋发展的面向对象编程方向。应用密码类动态库连接方式使应用程序与密码编程接口进一步分离,从而使增删密码类功能不十分影响应用程序。应用密码类的密码应用程序的密码速度虽比封装前稍慢,但其效果还是令人满意的。倘若密码几十兆字节的产品设计图纸肯定存在速度太慢的问题,此时可考虑将图纸分解密码。当然产品设计图纸的网络传输本身也存在速度太慢的问题。