加密技术是电子商务中最主要的安全技术之一,加密方法的选取直接影响着电子商务活动中信息的安全程度。由于JAVA一开始就是面向网络应用的,它十分重视数据的安全性,在JDKJ.1中就已可以支持DES加密技术,因此JAVA在电子商务中得到了广泛的应用。下面我就给大家介绍在Java环境下如何使用AES和RSA加密算法对数据文件进行加密和解密。
一、 JAVA中的数据加密技术
加密技术根据一般可以分为对称加密技术和非对称加密技术。对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密强度高,可以通过硬件方式来实现,适合大批量数据的加密处理,它的缺点是:加密和解密由于使用相同的密匙,密匙的分发与保密比较困难,目前常用的对称加密技术有DES、3DES和AES加密算法。
非对称加密技术属于现代加密技术,它的加密与解密的密钥是不相同的,一个是私钥,一个是公钥,它的特点是:加密强度比较小,加密的速度比较慢,常用于数字签名和加密密钥,目前使用的非对称加密技术主要有RSA和ECC加密算法,其中1024位的RSA是目前使用最为广泛的非对称加密技术。
JAVA语言的安全性是十分出色的,在JAVA中通过“Sun-JCF”提供对各种加密技术的支持。在JAVA还可以安装其它公司的加密包,使用“SunjCF”所不支持的其它加密算法。早在JDKl.l中就已支持DES数据加密技术,在JDKl.5中支持DES、3DES、AES等对称加密技术,在非对称加密技术方面支持RSA技术。
二、 JAVA中的数据加密类
(1)KeyGenerator类用于获得各类对称加密技术的密钥,主要的方法有:
getlnstance(“加密算法字符串”),用于设置要获得的密钥的加密算法
init(),用于初始化对称加密的密钥对象
generateKey(),从对称加密的密钥对象中取得密钥
(2)KeyPairGenerator类用于获得非对称加密技术的密匙,主要的方法有:
getlnstance(“非对称加密算法字符串”),用于设置要获得的密钥的加密算法
initialize(密钥长度),用于初始化非对称加密的密钥对象
generateKeyPair(),返回非对称密钥组对象
getPublic(),从非对称密钥组中取得公钥
geLPrivate(),从非对称密钥组中用于取得私钥
(3)Cipher类是JAVA加密的主要类,用于按一定的算法对数据文件进行加密、解密、包装和返包装。主要的方法有:
getInstance(“加密算法字符串”),用于设置要使用的加密算法
Init(“类型”,密匙),按提供的类型和密匙初始化加密对象
getBLockSize(),用于返回加密算法的输入分组长度
getOutputSize(),用于返回加密算法的输出分组长度
update(inBytes,blockSize,outBytes),对inBytes进行加密或解密处理,并将处理结果输出到outBytes中
doFinal(),对要不足分组长度的数据进行填充处理
三、JAVA中如何实现AES和RSA加密算法相结合的数据文件的加密和解密
根据我们上面介绍的有关对称加密技术和非对称加密技术的分析,现在我们一般采用对称加密技术和非对称加密技术相结合的方法来给文件加密。下面我们利用AES(对称加密技术)加密数据文件,利用RSA(非对称加密技术)加密AES加密密钥,这样即可以提高加密的速度,又可以解决AES密钥自身的安全性。由于数据文件进行了加密,因此可以通过普通的电子邮件系统完成加密文件的传输。AES和RSA相结合的数据文件加解密过程如下:
(1)接受方:生成1024位的RSA密钥对,然后通过电子邮件向发送方发送自己的公钥数据。
(2)发送方:第一步通过电子邮件取得接受方的RSA公钥数据;第二步随机生成AES密钥;第三步用获得的RSA公钥和RSA加密算法加密AES密钥并将加密后的AES密钥写人数据文件的头部;第四步用AES密钥和AES加密算法给数据文件加密,并将加密后的数据文件写入数据文件的尾部;最后通过电子邮件,以附件的形式将数据文件发送给接收方。
(3)接收方:第一步从接受到的邮件的附件中读取加密后的AES密钥;第二步用自己的私钥和RAS加密算法解密AES密钥;第三步接着从接受到的邮件的附件中读取加密数据文件,用于解密的AES密钥和ASE加密算法解密加密数据文件,并将解密后的数据写入数据文件。
2、如何在JAVA中实现AES和RSA加密算法相结合的数据文件加密和解密过程
具体源程序如下:
import java.io.*;
lrnport Java.security.*;
lmport Javax.cIypto.*;
impon javax.crypto.spec.*;
public class Aes_Rsa_ Encrypt
{
public static void inain(String[] args)
{
try
{
if(args[O].equals(”-g””//生成RSA密钥对
{
KeyPairGenerator keyGen=KeyPairGenerator.getln8tance("RSA");
SecureRandom random=new SecureRandom();
keyGen.initialize(1024,random);
KeyPair keypair = keyGen.generateKeyPair();
ObjectOutputStream out =new ObjectOuLputStream(new FileOut-putStream (l'pub_key"));
out.writeObject(keypair,getPublic());
out.close();
out =new ObjectOutputStream (new FileOutputStream C"pri_key"));
out.writeObject(keypair.getPrivate());
out.close();
}
else if(args[O].equals(" -e")) //对指定的数据文件进行加密处
{
KeyGenerator keyGen = KeyGenerator.getlnstance("AES");
keyGen.init(128);
SecretKey key=keyGen.generateKey(),
ObjectlnputSUeam keyln =new ObjectlnputStream (new Fileln-putStream ("pub_key"));
Key publicKey=(Key)keyln.readObject();
keyln.close();
Cipher cipher=Cipher.getlnstance("RSA");
cipher.init(Cipher.WRAP_MODE,publicKey);
byteo wrappedKey=cipher.wrap(key);
DataOutputStream out=new DataOutputStream (new FileOutput-Stream(args[2]));
out.writelnt(wrappedKey.length);
out.write(wrappedKey);
InputStream in=new FilelnputStream(args[l]);
cipher=Cipher.getlnstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,key);
crypt(in.out,cipher);
in.close();
out.close();
}
else if(args[Ol.equals("-d")])
{
DatalnputStream m =new DatalnputStream (new Filelnput-seam(rugs[i]));
int length=in.readlnt();
byteo wrappedKey=new bytepengthj;
in.read(wrappedKey,O,length);
ObjectlnputStream keyln =new ObjectlnputStream (new Fileln-putStream C'pri_key"));
Key privateKey=(Key)keyln.readObject();
keyln.close();
Cipher cipher=Cipher.getlnstance("RSA");
cipher.init(Cipher.UNWRAP_MODE,privateKey);
Key key =cipher.unwrap (wrappedKey,"AES",cipher.SE-CRET_KEY);
OutputStream out=new FileOutputStream(args[2]);
cipher=Cipher.getlnstance("AES");
cipher.init(CipherDECRYPT_MODE,key);
crypt(in,out,cipher);
in.close();
ouLclose();
}
}
catch (IOException exception)
{
exception.printStackTrace0;
}
catch (GeneraISecurityException exception)
{
exception.printStackTrace0;
}
catch (ClassNotFoundException exception)
{exception.printStackTrace0;
}
}
public static void crypt(lnputStream in,OutputStream out,Ciphercipher) throws IOException,GeneralSecurityException ii自己定义的
{
int blockSize=cipher.getBlockSize0;
int outputSize=cipher.getOutputSize(blockSize);
byte[] inBytes=new byte[blockSize];
byteU outBytes=new byte[outputSize];
int inLengtb=0;
boolean more=true;
while(more)
{ inLength=in.read(inBytes);
if(inLength==bjockSize)
{
int outLength=cipher.update(inBytes,O,blockSize,outBytes);
out.write(outBytes,O,outLength);
}
else
outBytes=c:ipher.doFinal0;
out.write(outBytes);
}
public static fmal int KEYSIZE=1024;
}
本程序可以完成RSA密钥的生成、数据文件加密和数据文件解密。运行前用iavac进行对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 _ 加密文件名 _ 解密文件名
本程序在JDKl.5下测试通过。
用JAVA来实现AES和RSA加密算法相结合的数据文件加密与解密方法非常的简便,您可以通过以上的方法操作试一下。
小知识之公钥
公钥是与私钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。