期刊鉴别 论文检测 免费论文 特惠期刊 学术答疑 发表流程

基于USBKey的考试系统安全的设计与实现(2)

时间:2016-04-13 17:29 文章来源:http://www.lunwenbuluo.com 作者:徐涛 文福安 点击次数:


  4 研究中遇到的技术难点及解决方案
  4.1 公钥导入问题
  由于USBKey内部有一定的存储空间,用来存储用户的私钥、会话秘钥以及数字证书等机密数据,而对该存储空间的读写操作必须要通过USBKey内的CSP (Cryptographic Service Provider)模块实现,用户无法直接读取数据。因此只有把服务器的公钥导入到USBKey中才能让CSP去访问该公钥,完成RSA加密。经研究发现USBkey提供的PKCS11接口中的C_CreateObject()函数能够将封装好的公钥导入到USBKey中。C_CreateObject()的函数定义如下:
  C_CreateObj ect创建了一个新的对象。hSession是对话的句柄;pTemplate指向对象的模板;uICount是模板中的属性数;phObject指向接收新对象句柄的单元。
  在使用该函数前,需要先定义公钥模板并对其中的参数赋值.然后才能导入。模板定义方式如下:
  CK—ATTRIBUTE pubTemplate[]=
  {
  { CKA_CLASS, &pubClass, sizeof (pubClass)),
  {CKA_ KEY_7IYPE ,
  &keyType ,
  sizeof(keyType)},
  {CKA_SUBJECT, subject. sizeof (subject)),
  { CKA_MODULUS_BITS, &uIModulusBits,sizeof (uIModulusBits)},
  { CKA_MODULUS, modulus, sizeof (modulus)},
  { CKA_PUBLIC_ EXPONENT, exponent, sizeof(exponent)},
  {CKA_ENCRYPT, &bTrue, sizeof (bTrue)},
  { CKA_TOKEN, &bTrue, sizeof (bTrue)},
  { CKA- WRAP, &bTrue, sizeof (bTrue)},
 );
  4.2 C++和java加解密通信问题
  考生机客户端和java服务器端进行双向加密和解密的通信过程中,C/C++加密后的数据通过网络传输到java服务器端进行解密时失败,报出bad_key的错误;同时java服务器端加密的数据经由网络传送到C/C++客户端解密时,也是失败,同样报出bad_key的错误。针对这个问题,研究发现,这与计算机体系中的字节序Big-Endian和Little-Endian有关。
  4.2.1 大端模式与小端模式
  在各种计算机体系结构中,对于字节、字、基本数据类型等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果达不成一致的传送顺序规则,通信双方将无法进行正确的编/译码从而导致双方通信失败。
  现代的计算机系统一般采用字节(8 bit Byte)作为逻辑寻址单位。每个地址单元都对应着一个字节,一个字节为8bit。然而在C/C++语言中除了8bit的char之外,还有16bit的wchar t型和short类型,32bit的Int及long类型,64位的double及long long类型(编译器不同,基本数据类型所占的长度也可能不同,具体情况需根据编译器自身的实现)。另外,对于位数大于8位的处理器,例如16位、32位或者64位的处理器,由于寄存器宽度大于一个字节(8 bit),那么必然存在着如何安排多个字节数据存储顺序(Byte Order)的问题。常见的字节存储顺序有两种:Big Endian(High-byte first)和Little Endian (Low-byte first). IntelX86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。另外,对于大小端的处理也和编译器的具体实现有关。
  (1) Little-Endian,即小端存储模式。就是指数据的高位字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。C/C++语言采用的存储模式就是Little-Endian,比如有一个双字节变量shortA-OX1234,那么A所代表的变量的第一个字节存储的是OX34,第二个字节存数的是OX12.
  (2) Big-Endian,即大端存储模式。就是指数据的高位字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这种存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。Java语言采用存储模式是Big-Endian。比如在Java中有一个双字节变量shortA-OX1234,那么A所代表的变量的第一个字节存储的是OX12,第二个字节存数的是OX34;与C/C++语言中的正好相反。
  另外在网络字节序中:TCP/IP各层协议将字节序顺序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。故而网络中传输的数据为Big-Endian类型。
  由以上字节序的介绍可知,一个C/C++中的UTF-16编码的字母或者多余一个字节的基本数据类型(short类型,int类型,double类型等),传输到Java语言中,要转换成java语言的Big-Endian位表示形式(逆序顺序交换高低位字节),才能正确译码,反之亦然。
  而RSA算法对数据的加密和解密算法均是基于大数质数分解的,比如一个1024位的公钥的模数N,就是一个128字节大小的整数。其加密后的数据也是一个很大的整数。由于加密后的数据是一个大整数,多于一个字节,便也存在大小端表示问题。因此在Java和C/C++中要对解密前的数据按字节进行反转后才能解密成功。
  4.2.2 加解密算法的数据转换流程
  为了避免数据的多字节存储问题(如UTF-16编码的双字节字符,从C/C++语言与Java语言,就要进行字节序的转换),不管何种语言,均将要加密的明文字符串转换为UTF-8字节流,然后进行加密;解密完成时,再进行UTF-8解码,最终形成正确的明文数据。这样有两个好处:
  (l)可以避免UTF-16编码字符带来的大小端转换问题
  (2)同时由于使用的数据大部分为英文字符,由UTF-16转换为UTF-8,可以节省一个字节的存储空间,这样便可减小要加密的字节数,加快加解密数据的速度。
  因此,考生机客户端(C/C++端)对数据RSA加密的数据转换流程如图2。首先,明文数据经过UTF-8编码,然后调用USBKey中CSP模块完成数据的加密,得到的数据按照一个字节一个字节的逆序翻转,再经过Base64编码,方便在网络上进行传输,保证数据传输过程不会出现差错。上述流程中,加密完的数据进行按字节逆序翻转,是因为RSA加密运算的结果也是一个大整数,也存在大端存储和小端存储的问题,进行转换后,方便JAVA服务器端进行数据的解密。
  Java端进行解密时数据转换流程如图3。首先,收到的密文先经过Base64解码,然后调用服务器端CSP模块解密,最后经由UTF-8解码,获得最终的明文数据。
  4.3 证书导出公钥
  在考生机客户端和服务器通信的过程中,java服务器需要使用客户端的公钥加密数据,因此需要获得客户端公钥。而客户端的公钥存储在USBKey中的数字证书里。因此就需要从USBKey的证书中导出公钥参数,即公钥的模数N和指数E。然而由于RSA算法对数据的加密和解密算法均是基于大数质数分解的,模数N和指数E也都是一个大整数(Biginterger),因此其也存在大端表示和小端表示。C/C++采用LittleEndian,而Java采用Big Endian,因此从客户端证书中读取到N和E后,需要将其按字节反转,转换为java端大端存储形式,才能得到正确的N和E,并用其进行RSA加密。
  5 结论
  本文为了解决自主开发的在线考试系统的安全问题,引人了PKI安全体系,在PKI基础之上结合数字证书的形式解决了公钥信息的存储表示问题,通过把要传输的数字信息进行加密和签名,保证信息传输的机密性、真实性、完整性和不可否认性。同时使用硬件USBKey的存储空间存储用户的私钥、会话秘钥以及数字证书等机密数据,并通过该硬件保证用户的私钥不可导出,这样以来就又充分保证了私钥等机密信息的安全性。通过这个设计方案,提供了银行级别的安全保障。本人还对这个设计方案进行了实现,解决了遇到的一些关键问题,尤其是C/C++和java跨语言的相互加密和解密的通信问题。


  •   论文部落提供核心期刊、国家级期刊、省级期刊、SCI期刊和EI期刊等咨询服务。
  •   论文部落拥有一支经验丰富、高端专业的编辑团队,可帮助您指导各领域学术文章,您只需提出详细的论文写作要求和相关资料。
  •  
  •   论文投稿客服QQ: 论文投稿2863358778 论文投稿2316118108
  •  
  •   论文投稿电话:15380085870
  •  
  •   论文投稿邮箱:lunwenbuluo@126.com

联系方式

  • 论文投稿客服QQ: 论文投稿2863358778
  • 论文投稿客服QQ: 论文投稿2316118108
  • 论文投稿电话:15380085870
  • 论文投稿邮箱:lunwenbuluo@126.com

热门排行

 
QQ在线咨询
咨询热线:
15380085870
微信号咨询:
lunwenbuluoli