论文部分内容阅读
摘要: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.
关键词: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.