AES、RSA相结合的数据加密方案在Java中的实现

来源 :电脑知识与技术·学术交流 | 被引量 : 0次 | 上传用户:redbattleline
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:JAVA通过“SunJCF”技术向开发者提供了先进的加密技术,在J2EE电子商务应用中运用这些技术可以大大提高系统的数据安全性。该文主要研究了“SunJCF”中提供的AES、RSA加密算法的具体实现方法,提出了在Java中综合运用AES和RSA算法加密数据文件的方案,并给出了相应的Java程序。
  关键词:JAVA;AES;RSA
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)14-20785-02
  
  1 引言
  
  由于Internet网络协议本身存在着安全问题,网上信息传输存在着巨大的安全风险,电子商务的安全问题越来越突出。加密技术是电子商务中最主要的安全技术,加密方法的选取直接影响着电子商务活动中信息的安全程度。由于JAVA一开始就是面向网络应用的,它十分重视数据的安全性,在JDK1.1中就已支持DES加密技术。因此JAVA在电子商务中得到了广泛的应用。本文主要介绍在Java环境下使用AES和RSA加密算法对数据文件进行加密和解密。
  
  2 JAVA中的数据加密技术
  
  加密技术根据一般可以分为对称加密技术和非对称加密技术。对称加密技术属于传统的加密技术,它的加密和解密的密匙是相同的,它的优点是:运算速度快,加密强度高,可以通过硬件方式来实现,适合大批量数据的加密处理,它的缺点是:加密和解密由于使用相同的密匙,密匙的分发与保密比较困难,目前常用的对称加密技术有DES、3DES和AES,DES是旧的加密标准,它的密匙长度为56位,加密强度较低,已被认为不是安全的加密技术。3DES是对DES的改进,对明文用三个不同的DES密匙进行DES加密、解密和再加密,这样可以提高加密强度。AES是新的加密标准,它是DES的替代者,它的密匙长度有128、192和256三种,目前还没有被人攻破。非对称加密技术属于现加密技术,它的加密与解密的密匙是不相同的,一个是私匙,一个是公匙,它的特点是:加密强度比较小,加密的速度比较慢,常用于数字鉴名和加密密匙,目前使用的非对称加密技术主要有RSA和ECC,其中1024位的RSA是目前使用最为广泛的非对称加密技术。
  JAVA语言的安全性是十分出色的,在JAVA中通过“SunJCF”提供对各种加密技术的支持。在JAVA还可以安装其它公司的加密包,使用“SunJCF”所不支持的其它加密算法。早在JDK1.1中就已支持DES数据加密技术,在JDK1.5中支持DES、3DES、AES等对称加密技术,在非对称加密技术方面支持RSA技术。
  
  3 JAVA中的数据加密类
  
  (1)KeyGenerator类用于获得各类对称加密技术的密匙,主要的方法有:
  getInstance("加密算法字符串"),用于设置要获得的密匙的加密算法;
  init(),用于初始化对称加密的密匙对象;
  generateKey(),从对称加密的密匙对象中取得密匙。
  (2)KeyPairGenerator类用于获得非对称加密技术的密匙,主要的方法有:
  etInstance("非对称加密算法字符串"),用于设置要获得的密匙的加密算法;
  initialize(密匙长度),用于初始化非对称加密的密匙对象;
  generateKeyPair(),返回非对称密匙组对象;
  getPublic(),从非对称密匙组中取得公匙;
  getPrivate(),从非对称密匙组中用于取得私匙。
  (3)Cipher类是JAVA加密的主要类,用于按一定的算法对数据进行加密、解密、包装和返包装。主要的方法有:
  getInstance("加密算法字符串"),用于设置要使用的加密算法;
  Init("类型",密匙),按提供的类型和密匙初始化加密对象;
  getBLockSize(),用于返回加密算法的输入分组长度;
  getOutputSize(),用于返回加密算法的输出分组长度;
  update(inBytes,blockSize,outBytes),对inBytes进行加密或解密处理,并将处理结果输出到outBytes中;
  doFinal(),对要不足分组长度的数据进行填充处理。
  
  4 AVA中实现AES和RSA相结合的数据加解密
  
  (1)根据前面有关对称加密技术和非对称加密技术的分析,在电子应用于一般采用对称加密技术和非对称加密技术相结合的方法。在下面的例子中利用AES(对称加密技术)加密数据文件,利用RSA(非对称加密技术)加密AES加密密匙,这样即可以提高加密的速度,又可以解决AES密匙自身的安全性。由于数据文件进行了加密因此可以通过普通的电子邮件系统完成加密文件的传输。AES和RSA相结合的数据文件加解密过程如下:
  ①接受方:生成1024位的RSA密匙对,然后通过电子邮件向发送方发送自己的公匙数据。
  ②发送方:第一步通过电子邮件取得接受方的RSA公匙数据;第二步随机生成AES密匙;第三步用获得的RSA公匙和RSA加密算法加密AES密匙并将加密后的AES密匙写入数据文件的头部;第四步用AES密匙和AES加密算法加密数据,并将加密后的数据写出入数据文件的尾部;最后通过电子邮件,以附件的形式将数据文件发送给接收方。
  ③接收方:第一步从接受到的邮件的附件中读取加密后的AES密匙;第二步用自己的私匙和RAS算法解密AES密匙;第三步接着从接受到的邮件的附件中读取加密数据,用解密后的AES密匙和ASE算法解密加密数据,并将解密后的数据写入数据文件。
  (2)在JAVA中实现上述AES和RSA算法相结合的数据加解密过程是十分容易的,具体源程序如下:
  import java.io.*;
  import java.security.*;
  import javax.crypto.*;
  import javax.crypto.spec.*;
  public classAes_Rsa_ Encrypt
  {public static void main(String[] args)
  {try
  {if(args[0].equals("-g")) //生成RSA密匙对
  {KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
  SecureRandom random=new SecureRandom();
  keyGen.initialize(1024,random);
  KeyPair keypair = keyGen.generateKeyPair();
  ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream ("pub_key"));
  out.writeObject(keypair.getPublic());
  out.close();
  out =new ObjectOutputStream(new FileOutputStream("pri_key"));
  out.writeObject(keypair.getPrivate());
  out.close();}
  else if(args[0].equals("-e"))//对指定的数据文件进行加密处理
  {KeyGenerator keyGen = KeyGenerator.getInstance("AES");
  keyGen.init(128);
  SecretKey key=keyGen.generateKey();
  ObjectInputStream keyIn =new ObjectInputStream(new FileInputStream ("pub_key"));
  Key publicKey=(Key)keyIn.readObject();
  keyIn.close();Cipher cipher=Cipher.getInstance("RSA");
  cipher.init(Cipher.WRAP_MODE,publicKey);
  byte[] wrappedKey=cipher.wrap(key);
  DataOutputStream out=new DataOutputStream(new FileOutputStream(args[2]));
  out.writeInt(wrappedKey.length);
  out.write(wrappedKey);
  InputStream in=new FileInputStream(args[1]);
  cipher=Cipher.getInstance("AES");
  cipher.init(Cipher.ENCRYPT_MODE,key);
  crypt(in,out,cipher);
  in.close();
  out.close();}
  else if(args[0].equals("-d"))//对指定的加密文件进行解密处理
  {DataInputStream in=new DataInputStream(new FileInputStream(args[1]));
  int length=in.readInt();
  byte[] wrappedKey=new byte[length];
  in.read(wrappedKey,0,length);
  ObjectInputStream keyIn =new ObjectInputStream(new FileInputStream ("pri_key"));
  Key privateKey=(Key)keyIn.readObject();
  keyIn.close();
  Cipher cipher=Cipher.getInstance("RSA");
  cipher.init(Cipher.UNWRAP_MODE,privateKey);
  Key key=cipher.unwrap(wrappedKey,"AES",cipher.SECRET_KEY);
  OutputStream out=new FileOutputStream(args[2]);
  cipher=Cipher.getInstance("AES");
  cipher.init(Cipher.DECRYPT_MODE,key);
  crypt(in,out,cipher);
  in.close();
  out.close();}}
  catch (IOException exception)
  {exception.printStackTrace();}
  catch (GeneralSecurityException exception)
  { exception.printStackTrace(); }
  catch (ClassNotFoundException exception)
  {exception.printStackTrace();}}
  public static void crypt(InputStream in,OutputStream out,Cipher cipher) throws IOException,GeneralSecurityException//自己定义的加密函数
  {int blockSize=cipher.getBlockSize();
  int outputSize=cipher.getOutputSize(blockSize);
  byte[] inBytes=new byte[blockSize];
  byte[] outBytes=new byte[outputSize];
  int inLength=0;
  boolean more=true;
  while(more)
  {inLength=in.read(inBytes);
  if(inLength==blockSize)
  {int outLength=cipher.update(inBytes,0,blockSize,outBytes);
  out.write(outBytes,0,outLength);}
  else
  {more=false;}}
  if(inLength>0)
  outBytes=cipher.doFinal(inBytes,0,inLength);
  else
  outBytes=cipher.doFinal();
  out.write(outBytes);}
  public static final int KEYSIZE=1024;}
  本程序可以完成RSA密匙的生成、数据加密和数据解密。运行前用javac进行对Aes_Rsa_ Encrypt.java文件进行编译,然后按如下方法执行:
  (1) 生成RSA算法的私匙文件(文件名为pri_key)和公匙文件(文件名为pub_key)
  java Aes_Rsa_Encrypt -g keyfile
  (2) 对指定的数据文件中的内容进行加密,并将结果写出入指定的加密文件
  java Aes_Rsa_Encrypt -e 数据文件名 加密文件名
  (3) 对指定的加密文件中的内容进行解密,并将结果写出入指定的解密文件
  java Aes_Rsa_Encrypt -d 加密文件名 解密文件名
  本程序在JDK1.5下测试通过。
  
  参考文献:
  [1] (美)Cay S.Horstmann,王建华,等译. Java核心技术卷Ⅱ:高级特性[M].北京:机械工业计,20059.
  [2] 丁玲,等. JAVA与网络安全[J].科技信息(学术研究),2007,(17):201.
  [3] 徐甜. Java平台及应用Java技术的安全问题研究[J].微计算机信息,2007,(18):216-218.
  [4] 赵航涛,等. 我国电子商务中的安全问题及对策[J].无锡职业技术学院,2006,(3):76-78.
其他文献
摘要:目前,微课在我国处于快速推广和发展阶段,因为其符合现代人的学习习惯和生理规律的特点而受到广大学习者和教学者的关注和推崇,但在具体的实施过程中又会出现这样那样的问题。LearnSite是一个一线教师开发的开源在线学习系统。该文结合微课的组成结构、特征,对其在LearnSite平台上的构建过程进行了初的探索,以期实现学习工具与先进教学理念的有机结合,从而形成高效的微课堂。  关键词:LearnS
摘要:网络大环境下,信息化教学已成为一种常风的教学方式。如何利用信息化教学,真正让学生成为课堂的主人,使学生被动从课堂接受知识,转变为利用课后随时随地学习,是信息化教学的需要解决的关键问题。文章以C#程序设计单元教学为例,借助该课程的学习平台及课程资源库,按课前、课中、课后三个阶段,对教学进行了相关的设计。整个设计以学生为主体,通过对学生的动手、动脑的能力训练,体现了“做中学”的内涵。从而更好地实
摘要:采用DNA超级计算,设计出芯片错误测试的有效算法,并将之与现有测试技术结合,解决现有集成电路中错误测试中存在因耗时过长而无法保证芯片电路准确率达到100%这一实质问题。最后阐述了芯片测试的DNA计算机算法研究的意义、现状、研究内容、研究方法等。  关键词:芯片测试;DNA计算;研究  中图分类号:TP384文献标识码:A文章编号:1009-3044(2008)23-1059-02  Chip
摘要:随着经济与信息技术的不断发展,URP是高校信息化建设势在必行的工作环节。在南京财经大学“十二五”规划背景下,已明确落实信息化建设工作是实现校园内涵提升的重要建设点。面对在学校URP建设及应用过程中的效率和功效矛盾,需要视觉导视系统的合理介入,从而完善高校信息化基础平台建设,引导现有平台瓶颈,铺设高校信息化建设的可持续发展的路径。  关键词:URP;视觉导视系统;南京财经大学;信息化  中图分
摘要:智能化多媒体网络集中控制系统是多媒体教学系统的控制中心。随着各大中专院校多媒体教室数量的持续增加,传统的中控设备已经不能满足管理信息化的需求,如何高效地实现多媒体教室装备的智能化集中安全管理是21世纪的要求与呼唤。  关键词:智能化;集中控制;RS232;网控子系统  中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)35-8540-02  Intelligen
摘要:语言实验室在我校外语教学中发挥着重要作用,做好语音室的管理与维护需要领导重视,理念先进,健全的管理制度和机制,以及适度的人文管理。同时,加强学习新技术,提高管理水平和服务意识也是做好语音室管理的重要因素。  关键词:语音室;外语教学;管理与维护;人文管理;服务意识  中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)01-0088-02  随着计算机和网络技术的日
摘要:协同设计平台是为任意工作场所内基于项目协同工作的设计团队进行分工协作、专业相互配合以及协作共同完成设计工作而设计的,它确保无障碍的进行协作作业,该文介绍了这一方案。  关键词:CAD 协同设计;勘察设计;信息化  中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)05-0099-03  1 概述  工程项目设计工作由多个专业、许多设计人员甚至多个工作场所的多个设
摘要:在服务外包培养模式中,建立合理的课程体系是人才培养的重要环节。C/C 作为一门重要的专业基础课程,经过多年教学改革,形成了具有鲜明特色的课程。  关键词:服务外包;教学改革;特色课程  中图分类号:TP3 文献标识码:A 文章编号:1009-3044(2014)30-7164-02  在应用型人才培养模式下,安徽新华学院建成服务型外包人才培养基地。发展服务外包的关键在人才,尤其是一大批高素
摘要:交互式设计在网站的设计中起着重要的作用,该文以湖南教育网花宠共建频道为切入点,设计了基于beta data的交互式网站设计解决方案并对交互式设计在网站建设中的应用进行研究。  关键词:交互式设计;网站建设;beta  中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)01-0030-02  1 研究背景  交互设计,又称互动设计,是定义、设计人造系统的行为的设计
摘要:为提高学生的逻辑思维能力和解决问题能力,探讨了在程序设计公共课中如何使用e-Learning。为此,进行了问卷调查,调查结果表明对程序设计有不安感的学生较多,也未能有效利用e-Learning系统。建议在程序设计公共课教学中使用较成熟的Moodle平台,并探讨了Moodle的授课内容、发布形式、测试方法以及以追加模块方式扩展Moodle平台功能。  关键词: e-Learning;Moodl