对称加密:
发送方:将明文和密钥一起经过加密算法处理生成密文,然后发送给出去。
解密方:接收到密文后,使用加密密钥和相同算法的逆算法进行机密,恢复为明文。
双方使用的密钥必须相同,否则无法正确解密。
常见的几种对称算法:DES(Data Encryption Standard—数据加密标准,使用了56位的密钥)、3DES(经过3重DES加密的算法,使用3组56位密钥对数据进行3次加密,是DES的增强版)、AES(Advanced Encryption Standard—高级加密标准,设计有3个密钥长度128、192、256位,128位的AES比DES安全)。
?
DES算法示例代码:
3DES实现上程序结构与DES一致,只需要将算法名称改为DESede即可。
AES程序结构与DES一致,算法名称改为AES即可。
package com.security.example.example2;
?
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
?
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
?
import org.apache.log4j.Logger;
?
/**
* 对称加密。
* 过程:发送方将明文和加密密钥一起经过加密算法处理变成密文,发送给解密方。
* 解密方接收到密文后,使用加密密钥和相同算法的逆算法对密文进行解密,恢复为明文。
* 双方使用的密钥相同。加密时使用什么密钥,解密时必须使用相同的密钥,否则无法解密。
* 对于相同的明文,不同的密钥加密和解密的结果不同。
* @author lucky star
*
*/
public class DesCipher {
private static Logger logger = Logger.getLogger(DesCipher.class);
// 密钥生成器
private KeyGenerator keygen = null;
// 保存对称密钥
private SecretKey secKey = null;
// 负责完成加密/解密
private Cipher cipher = null;
?
/**
* 使用指定算法加密/解密。
* @param algorithm
*/
public DesCipher(String algorithm) {
try {
keygen = KeyGenerator.getInstance(algorithm);
secKey = keygen.generateKey();
cipher = Cipher.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
?
/**
* 对msg进行加密并返回密文。
* @param msg
* @return
*/
public byte[] encryp(String msg) {
try {
// Cipher.ENCRYPT_MODE:表示加密
cipher.init(Cipher.ENCRYPT_MODE, secKey);
byte[] encrypMsg = cipher.doFinal(msg.getBytes());
logger.debug("加密后是:" + new String(encrypMsg));
return encrypMsg;
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
?
/**
* 解密。
* @return
*/
public byte[] decryp(byte[] encrypMsg) {
try {
cipher.init(Cipher.DECRYPT_MODE,secKey);
byte[] decrypMsg = cipher.doFinal(encrypMsg);
logger.debug("解密后的内容:" + new String(decrypMsg));
return decrypMsg;
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* @param args
*/
public static void main(String[] args) {
String msg = "java安全编程技术_DES";
logger.debug("原文:" + msg);
DesCipher dc = new DesCipher("DES");
byte[] encrypMsg = dc.encryp(msg);
byte[] decrypMsg = dc.decryp(encrypMsg);
}
?
}
?
输出:
2013-01-29 14:15:14,003[main]DEBUG [main] - 原文:java安全编程技术_DES
2013-01-29 14:15:14,268[main]DEBUG [main] - 加密后是:N豣a疥噍/]薉>嘻?灹L
2013-01-29 14:15:14,268[main]DEBUG [main] - 解密后的内容:java安全编程技术_DES