一种通用安全加密接口的制作方法

文档序号:6575667阅读:408来源:国知局
专利名称:一种通用安全加密接口的制作方法
技术领域
本发明是一种计算机安全应用的通用安全加密接口。
在科学技术飞速发展的今天,计算机已广泛运用于政治、经济、军事、科研、文化、教育、商业及工农业生产等各个领域,由于它是有使用方便,能快捷地转发信息及存储信息量大等许多优点,因此颇受世人的青睐,但在激烈竟争的环境下,人们对计算机之间秘密信息的存储与通信的安全应用极为担心,因此使用加密算法的信息安全产品便应运而生了,但目前的信息安全产品在使用加密算法时,将上层应用程序和下层的加密算法捆得较死,如果需要更换加密算法,必须要修改源代码,重新编译执行。生产应用程序的厂商,往往要花精力在加密算法的实现上,而生产加密算法的厂商又要花精力在上层应用程序上,目前国内还没有对上层应用程序和下层加密算法之间接口的相应规范。
本发明的目的是规范上层应用程序和下层加密算法的接口标准,对上层应用程序简化了各种安全接口,对下层算法模块作出了相应的规范。能做到在不修改源代码的情况下,动态,方便的替换安全应用的加密算法。
本发明的方法如

图1所示,采用一种通用安全加密接口,将上层应用程序1和下层加密算法(软、硬件算法模块6与驱动程序7)结合在一起,形成一个整体。
本发明具体实施步骤如下1、设计上层应用程序应用程序1开发使用本接口2,需按照一种通用安全加密接口2提供的“Chini-appl.h”、“chini_typee.h”头文件中提供的应用编程接口,首先调用函数Chini_start然后才能在需要加解密等处调用相应的接口函数5最后还要调用Chini-end。
2、设计加密算法模块按照一种通用安全加密接口规范中对算法模块接口函数5标准的规定、生产算法模块的厂商提供加密算法实现的动态库,它向一种通用安全加密接口提供统一的接口函数。
3、组合上层应用程序1和下层加密算法模块6应用程序1必须通过一种通用安全加密接口2提供的Libaspi库用配置文件管理命令3配置好配置文件4,这样才能正确的加载算法模块6,形成一个整体。将配置文件4放在指定的位置,将加密算法模块6放到默认路径“/Chini/Security/algmod/”下,并在配置文件4中正确的配置好应用程序使用的类名和加密算法模块的库名。
4、通过上述的操作,一个功能完善的安全应用就产生了,用户可以照上层应用程序的普通使用方法使用即可。
5、当需要更换加密算法模块6时,先退出运行的应用程序,然后修改配置文件4将应用程序对应的类名的加密算法模块的库名改换成的新的加密算法模块的库名,然后将新的算法模块动态库放在指定的位置,再启动应用程序,这时就能使用新的加密算法进行加/解密等操作了。
本发明的接口函数5包括上层应用函数接口和下层加密算法模块函数接口和两个头文件“Chini-appl.h”及“Chini_types.h”。上层应用函数接口(5-01~5-12)。下层加密算法模块函数接口(5-13~5-22)如下密钥数据结构ALGKEY应用程序调用API函数所有的密钥参数都是一个该结构的指针。
<pre listing-type="program-listing"><![CDATA[typedef struct algkey_st{ unsigned char*key;密钥指针 int key_type;密钥类型 int key_len; 密钥长度}ALGKEY;]]></pre>上层应用接口函数5-01.初始化Chini Sec Interface函数原型int chini_start(Tokenstruct**token,char*classname,char*instname);参数token 加密操作标识classname 调用应用的类型名instname调用应用的实例名备注从算法配置文件中根据应用的类型名、应用的实例名获取与该应用相应的算法库,并加载相应的算法模块、返回一个token。在引用其它API时,应给出相应的token。
5-02.加解密函数原型int chini_enc(Tokenstruct*token,void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*workey,void*IV,int EncMode,int EncType);参数token 加密操作标识pDatIn输入数据pDataInLen输入数据长度pDataOut 输出数据,应用程序申请内存,以下同pDataOutLen 输出数据长度,由算法模块返回,以下同workey工作密钥结构,包括密钥、密钥长度、密钥类型(1表示只有一种密钥长度,2表示有两种密钥长度,3表示有三种密钥长度)IV 初始向量,其长度与分组长度相同。
EncMode 操作模式1 ECB2 CBC3 OFB4 CFBEncType 加密/解密类型选择1 加密0 解密备注加密/解密函数,调用算法模块中的函数_enc(pDataIn,pDataInLen,pDataOut,pDataOutLen,workey,IV EncMode,EncType)。
5-03.散列函数原型int chini_hash(Tokenstruct*token,void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*HashIv);
参数token加密操作标识pDataIn 输入数据pDataInLen 输入数据长度pDataOut 输出数据pDataOutLen 输出数据长度HashIv 散列初始向量备注散列函数,调用算法模块中的函数_hash(pDataIn,pDataInLen,pDataOut,pDataOutLen,HashIv)。
5-04.求校验码函数原型int chini_mac(Tokenstruct*token,void*pDataIn,int pDataInLen,void*pDataOut,init*pDataOutLen,void*MacKey);参数token加密操作标识pDataIn 输入数据pDataInLen 输入数据长度pDataOut 输出数据pDataOutLen 输出数据长度MacKey 校验函数密钥结构备注计算校验码,调用算法模块中的函数_mac(pDataIn,pDataInLen,pDataOut,pDataOutLen,MacKey)。
5-05.签名函数原型int chini_sign(Tokenstruct*token,void*Message,int MLen,void*SignData,int*SignDataLen,void*Seckey);参数
token 加密操作标识Message 需要签名的消息MLen消息的长度SignData签名结果数据SignDataLen 签名数据长度Seckey 签名者的私有密钥备注做数字签名,调用算法模块中的函数_sign(Message,MLen,SignData,SignDataLen,Seckey)。
5-06.验证签名函数原型int chini_verify(Tokenstruct*token,void*Message,int MLen,void*SignData,intSignLen,void*Pubkey);参数token 加密操作标识Message 需要验证签名的消息MLen消息的长度Pubkey签名者的公开密钥SignData签名数据SignDataLen 签名数据长度备注对数字签名作验证,调用算法模块中的函数_verify(Message,MLen,SignData,SignDataLen,Pubkey)。
5-07.随机数函数原型int chini_rand(Tokenstruct*token,void*RandNum,int RandLen);参数token加密操作标识RandNum产生的随机数RandLen随机数长度(byte)
备注随机数函数。调用算法模块中的函数_gerrand(RandNum,RandLen)5-08.得到工作密钥函数原型int chini_getworkkey(TokenStruct*token,void*workkey,int*keylen,void*iv,int*ivlen,int flag)参数token 加密操作标识workkey 工作密钥keylen 工作密钥长度iv 初始化向量ivlen 初始化向量长度flag加解密标志备注得到工作密钥函数,包括初始化向量,调用算法模块中的函数int_getworkkey(void*workkey,int*keylen,void*iv,int*ivlen,int flag)5-09.公钥加密函数原型int chini_publicenc(TokenStruct*token,void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*publickey)参数token加密操作标识pDataIn 输入数据pDataInLen 输入数据长度pDataOut 输出数据,应用程序申请内存,以下同pDataOutLen 输出数据长度,由算法模块返回,以下同publickey 公钥备注公钥加密函数,调用算法模块中的函数
int_publicenc(void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*publickey)5-10.私钥解密函数原型int chini_privatedec(TokenStruct*token,void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*privatekey)参数token加密操作标识pDataIn 输入数据pDataInLen 输入数据长度pDataOut 输出数据pDataOutLen 输出数据长度privatekey 私钥备注私钥解密函数,调用算法模块中的函数int_privatedec(void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*privatekey)5-11.算法模块的属性函数原型int chini_algatt(Tokenstruct*token,AttID*AttStruct);参数token加密操作标识AttStruct算法模块的属性算法模块的属性包括模块名称、模块版本号、制造商、对称算法审批号、对称算法支持的密钥长度列表、非对称算法审批号、非对称算法支持密钥长度列表、Hash函数审批号、Hash函数初始化向量长度、MAC初始化向量长度。
算法模块的属性结构具体描述如下密钥长度列表数据结构ALG_TBL由于有些加密算法有几种密钥长度,所以设计了该密钥长度列表结构,它是一个链表数据结构。
<pre listing-type="program-listing"><![CDATA[typedef struct alg_tbl{ int byte_len; 密钥长度 struct alg_tbl*next;}ALG TBL]]></pre>算法信息数据结构ALG_INFO包括分组算法、公开密钥算法、HASH、MAC。
<pre listing-type="program-listing"><![CDATA[tvpedef struct alg_st{ char*alg_name; 算法名 char*alg_serial;算法审批号 int key_type; 密钥类型值含义 1 一种密钥长度 2 两种密钥长度 3 三种密钥长度 4 任意密钥长度intblock_byte_len;分组算法分组长度(或HASH值长度、MAC值长度)ALG_TBL key;密钥列表结构 }ALG_INFO;]]></pre>算法模块属性数据结构AttID<pre listing-type="program-listing"><![CDATA[typedef struct attid_st{char *module_name; 算法模块名char *module_ver;算法模块版本号char *module_maker; 算法模块生产商ALG_INFO block_alg; 分组算法 ALG_INFO pk_alg; 公开密钥算法 ALG_INFOhash; HASH算法 ALG_INFOmac;MAC算法}AttID;]]></pre>备注算法模块的属性函数,可获取该算法模块的有关信息。调用算法模块中的函数_algatt(AttStruct)。
5-12.关闭Chini SecAPI函数原型int chini_end(Tokenstruct*token);参数token 加密操作标识备注关闭Chini SecAPI函数,释放内存。
下层加密算法模块函数接口这些接口函数都由API中的相应函数调用,其参数含义与API中的函数相同。接口函数的名字和参数类型在每一个算法模块中都是一样的所有函数调用成功都返回0,其它返回值都是调用出错。
5-13.enc(void*Message,int MsgLen,void*Output,int*OutputLen,void*Workey,void*IV,int EncMode,int EncType)这个函数完成分组密码算法各种操作方式的加/解密运算。根据参数EncType的值决定做加密还是解密,生成加密或解密子密钥,然后再根据参数EncMode的值选择操作方式。
5-14.verify(void*Message,int MsgLen,void*Signature,int SignatureLen,void*Key)这个函数完成公钥密码算法的验证运算,包括对消息(Message)的散列运算,用密钥Key解密签名值Signature,比较以上两步的结果,相同则返回真,否则返回错误值。
5-15._sign(void*Message,int MsgLen,void*Signature,int*SignatureLen,void*Key)这个函数完成公钥密码算法的签名运算,包括对消息(Message)的散列运算,用密钥Key加密散列结果。
5-16._hash(void*Message,int MsgLen,void*Hash,int*HashLen,void*HashIv)这个函数完成散列运算,得到散列值。
5-17._mac(void*Message,int MsgLen,void*Output,int*OutputLen,void*MacIv)这个函数计算消息的校验码。
5-18._algatt(AttId*AttStruct)这个函数调用提供该算法模块的属性。
5-19._gerrand(void*Rand,int RandLen)这个函数调用产生随机数。
5-20._getworkkey(void*workkey,int*keylen,void*iv,int*ivlen,int flag)这个函数完成得到对称加解密时所需的工作密钥和初始化向量。根据参数flag的值决定是得到加密还是解密所需的工作密钥和初始化向量。
5-21._publicenc(void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*publickey)这个函数完成公钥密码算法(非对称密码算法)的公钥加密运算。使用输入的公钥对输入的数据进行非对称加密。
5-22._privatedec(void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*privatekey)这个函数完成公钥密码算法(非对称密码算法)的私钥解密运算。使用私钥对用公钥加密过的输入数据进行非对称解密。
说明以上接口函数中"_algatt( )"在每一个算法模块中都必须提供,其它接口函数是可选的,并非每个算法模块都必须提供全部的接口函数功能。
图1、一稀通用安全加密接口功能框架图。
1、应用程序;2、一种通用安全加密接口(API);3、配置文件管理命令;4、配置文件;5、函数接口;6、软、硬件算法模块;7、驱动程序。
本发明是一种编写信息安全软件的方法。它由一组动态库、配置文件和对上层应用和加密算法模块的各种安全接口的一系列规范标准组成,因此根据应用的发展、规范也将随着发展。因为这是一种方法,一种规范标准,所以不依据于特定的操作系统和特定的编程语言。可以用多种编程语言实现,如BASIC、PASCAL、FORTRAN、COBOL等,可适用于多种操作系统,如LINUX提供了用户空间和核心空间的接口规范、UNIX、WINDOWSNT、WINDOWS2000等,针对目前实现实际的情况,我们的相关文档中都以C语言作出示例,WINDOWS操作系统作为操作系统平台。
现举一例说明设计上层应用软件在本例中,提供了一个简单的演示程序,该程序是用C++Builder写的一个小的图形化应用程序。
为了简单起见,这里只对对称加解密部分的源代码设计做说明。
1、对称加密部分源代码<pre listing-type="program-listing"><![CDATA[……in_len=Edit1->GetTextLen(); in_len++; Edit1->GetTextBuf(enc_in,in_len);//这部分代码,得到了输入的要加密的数据和长度Size=Edit4->GetTextLen();Size++;Edit4->GetTextBuf(wkey,Size);//这部分代码,得到了输入的加密密钥和长度for(i=Size;i<32;i++) wkey[i]=0xbb;key.key=wkey;key.key_type=1;key.key_len=16;//这部分代码将得到的加密密钥,转换成要求的工作密钥结构形式 if(chini_start(&amp;token,DEMO_CLASS,DEMO_INSTANCE))//初始化通用加密接口{ Application->MessageBox(″初始化失败″,″加密″,MB_OK);return; }if(chini_enc(token,enc.in,in_len,enc_out,&amp;out_len, &amp;key,iv,CHINI_CBC,CHINI_ENC))//加密操作{ Application->MessageBox(″加密错误″,″加密″,MB_OK); return;}chini_end(token);//关闭通用加密接口enc_out[out_len]=0;Edit2->Text=(char*)enc_out;//显示加密结果Edit3->Text=NULL ……]]></pre>2.对称解密部分源代码<pre listing-type="program-listing"><![CDATA[…… Size=Edit4->GetTextLen();Size++;Edit4->GetTextBuf(wkey,Size);if(Size<32) ′for(i=Size;i<32;i++) wkey[i]=Oxbb; key.key=wkey; key.key_type=1; key.key_len=16;//这部分将解密密钥转化成要求的工作密钥结构形式if(chini_start(&amp;token,DEMO′_CLASS,DEMO_INSTANCE))//初始化通用加密接口 { Application->MessageBox(″初始化失败″,″解密″,MB_OK);return }if(chini_enc(token,enc.out.out_len,dec_out,&amp;in_len, &amp;key,iv,CHINI_CBC,CHINI_DEC))//解密操作{ Application->MessageBox("解密错误″,″解密″,MB_OK); Edit3->Text=0 return;   }′chini_end(token);//关闭通用加密接口Edit3->Text=(char*)dec_out;//显示解密结果;]]></pre>下层加密算法模块的设计本例中提供了两个加密算法模块,分别是twofish.dll(实现了twofish加密算法)和aes.dll(实现了AES加密算法),它们都是用VC++做的动态库。
为了简单起见,这里只对AES算法模块的对称加解密部分的实现源代码设计做说明。
1、AES加/解密函数接口_enc()实现部分源代码<pre listing-type="program-listing"><![CDATA[int_enc(void*pDataIn,int pDataInLen,void*pDataOut,int*pDataOutLen,void*workey,void*IV,int EncMode,int EncType) { ALGKEY*wkey=workey; int loop,ij,lastlen; short end; u4byte myIV[4],*tmp=NULL; u4byte*pIV=(u4byte*)IV;for(i=0;i<4;i++) myIV[i]=pIV[i];switch(EncMode){ case 1//ECB,没有对这种加密模式进行实现{ printf(″ECB is used.″); set_key((u4byte*)wkey->key,(u4byte)wkey->key_len*8); switch(EncType){ case 1 { } case 0 { } } return(1); } case 2//CBC,对这种加密模式的实现{set_key((u4byte*)wkey->key;(u4byte)wkey->key_len*8);switch(EncType) { case 1//ENC,加密操作的实现 { u4byte*pOut=(u4byte*)pDataOut;BYTE*p=(BYTE*)malloc(pDataInLen+16);if(!p)return-1;memcpy(p,pDataIn,pDataInLen);printf(″\nNow CBC-ENC is tarting…\n″);lastlen=pDataInLen%16;end=16-lastlen;for(i=0;i<=end-1;i++) *(p+pDataInLen+i)=end;//分组,填充 loop=(pDataInLen+end)/16;tmp=(u4byte*)p;for(i=0;i<loop;i++) { for(j=0;j<=3;j++) { tmp[j]^=(*(myIV+j));//异或运算 } encrypt(tmp,pOut);//调用AES加密函数for(j=0;j<4;j++) myIV[j]=pOut[j]; pOut+=4;tmp+=4; }*pDataOutLen=pDataInLen+end;free(p);return 0; }case 0//DEC,解密操作的实现 {,u4byte *pOut=(u4byte*)pDataOut; if(pDataInLen%16)return-1; Printf(″\nNow CBC-DEC is starting…\n″); loop=pDataInLen/16; tmp=(u4byte*)pDataIn; for(i=0;i<loop;i++) { decrypt(tmp,pOut);//调用AES解密函数 for(j=0;j<=3;j++){ pOut[j]^=myIV[j]; myIV[j]=tmp[j]; }tmp+=4;pOut+=4; } end=(BYTE)(*((BYTE*)pDataOut+pDataInLen-1)); if((end>=16)‖(end<0)) {printf(″Errorthis is end--%d\n″,end);return-1 } for(i=1;i<end;i++) if((BYTE)(*((BYTE*)pDataOut+pDataInLen-1-i))!=end){ return-1; } *pDataOutLen=pDataInLen-end; return 0;}  return-1;   }  case 3//OFB,,没有对这种加密模式进行实现    {   printf(″ErrorOFB is not used″);   return(-3);   }  case 4//CFB,,没有对这种加密模式进行实现   {   printf(″ErrorCFB is not used.″);   return(-4);   }  default   return(-5);   }   }  }]]></pre>将AES算法的加解密实现,按通用加密接口对算法模块的规范,封装成_enc()的形式,这样,上层应用就能通过一种通用加密接口,方便的使用了。
本发明可以满足以下三种应用形式的安全需要1、计算机之间的安全实时交互通信;2、计算机之间的安全存储转发通信;3、计算机本地信息数据和文件在安全存储。同时还可以让开发、应用的软件商专注于应用系统的开发,无须过多的考虑算法,生产算法的厂商可专注于算法的软、硬件实现,无须考虑各种应用的实现。
本发明将上层应用简化了各种安全接口,对下层算法模块作出了相应的规范,可在不修改应用的情况下方便地变换加密算法。
本发明可适用于各种计算机安全运用。
权利要求
1.一种将上层应用程序(1)和下层加密算法模块(6)结合成一个整体的方法是采用一种通用安全加密接口(2),其特征是按下列步骤实现的设计上层应用程序应用程序(1)开发使用本接口(2),需按照一种通用安全加密接口(2)提供的“Chim-appl.h”、“chini_typee.h”头文件中提供的应用编程接口,首先调用函数Chini_start,然后才能在需要加解密等处调用相应的接口函数(5)最后还要调用Chini-end。设计加密算法模块按照一种通用安全加密接口规范中对算法模块接口函数(5)标准的规定、生产算法模块的厂商提供加密算法实现的动态库,它向一种通用安全加密接口提供统一的接口函数。组合上层应用程序(1)和下层加密算法模块(6)应用程序(1)必须通过一种通用安全加密接口(2)提供的Libaspi库用配置文件管理命令(3)配置好配置文件(4),这样才能正确的加载算法模块(6),形成一个整体。将配置文件(4)放在指定的位置,将加密算法模块(6)放到默认路径“/Chini/Security/algmod/”下,并在配置文件(4)中正确的配置好应用程序使用的类名和加密算法模块的库名。通过上述的操作,一个功能完善的安全应用就产生了,用户可以照上层应用程序的普通使用方法使用即可。当需要更换加密算法模块(6)时,先退出运行的应用程序,然后修改配置文件4将应用程序对应的类名的加密算法模块的库名改换成的新的加密算法模块的库名,然后将新的算法模块动态库放在指定的位置,再启动应用程序,这时就能使用新的加密算法进行加/解密等操作了。
2.根据权利要求1所述一种通用安全加密接口,其特征是接口函数(5)是包括上层应用接口函数和下层加密算法模块接口函数和两个头文件“Chini-appl.h”及“Chini_types.h”,上层应用接口函数是初始化Chini sec interface函数、加解密函数、散列函数、求校验码函数、签名函数、验证签名函数、随机数函数、得到工作密钥函数、公钥解密函数、私钥加密函数、算法模块的属性函数、关闭ChinisecAPI函数,下层加密算法模块接口函数是_enc、_verify、_sign、_hash、_mac、_algatt、_gerrand、_getworkkey、_publicenc、_privatedec。
全文摘要
一种新的一种通用安全加密接口是对上层应用程序简化了各种安全接口,对下层加密算法模块作出了相应的规范,可满足计算机之间的安全实时交互通信,安全存储转发通信,本地信息数据和文件的安全存储。对开发应用的软件厂商可以专注于应用系统的开发,无需过多考虑算法,可在不修改应用的情况下方便地变换算法;生产算法的厂商可专注于算法的软硬件实现,无需考虑各种应用的实现。本发明应用于多种编程语言和各种操作系统的安全加密使用。
文档编号G06F3/00GK1372192SQ0211355
公开日2002年10月2日 申请日期2002年4月2日 优先权日2002年4月2日
发明者张建军, 李成斌, 蒋洪志, 刘鸿力 申请人:成都三零盛安信息系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1