对称加密:
发送方:将明文和密钥一起经过加密算法处理生成密文,然后发送给出去。
解密方:接收到密文后,使用加密密钥和相同算法的逆算法进行机密,恢复为明文。
双方使用的密钥必须相同,否则无法正确解密。
常见的几种对称算法: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 |