对称加密与非对称加密实战

对称加密需要对加密和解密使用相同密钥的加密算法 。由于其速度快 , 对称性加密通常在消息发送方需要加密大量数据时使用 。对称性加密也称为密钥加密 。
所谓对称 , 就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密 。密钥是控制加密及解密过程的指令 。算法是一组规则 , 规定如何进行加密和解密 。
因此加密的安全性不仅取决于加密算法本身 , 密钥管理的安全性更是重要 。因为加密和解密都使用同一个密钥 , 如何把密钥安全地传递到解密者手上就成了必须要解决的问题 。
DESDES是一种对称加密算法 , 是一种非常简便的加密算法 , 但是密钥长度比较短 。DES加密算法出自IBM的研究 , 后来被美国政府正式采用 , 之后开始广泛流传 , 但是近些年使用越来越少 , 因为DES使用56位密钥 , 以现代计算能力 , 24小时内即可被破解 。
public class DESUtil {private static final String KEY_ALGORITHM = "DES";private static final String DEFAULT_CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";//默认的加密算法/*** DES 加密操作** @param content 待加密内容* @param key 加密密钥* @return 返回Base64转码后的加密数据*/public static String encrypt(String content, String key) {try {Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));// 初始化为加密模式的密码器byte[] result = cipher.doFinal(byteContent);// 加密return Base64.encodeBase64String(result);//通过Base64转码返回} catch (Exception ex) {Logger.getLogger(DESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}/*** DES 解密操作** @param content* @param key* @return*/public static String decrypt(String content, String key) {try {//实例化Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);//使用密钥初始化 , 设置为解密模式cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));//执行操作byte[] result = cipher.doFinal(Base64.decodeBase64(content));return new String(result, "utf-8");} catch (Exception ex) {Logger.getLogger(DESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}/*** 生成加密秘钥** @return*/private static SecretKeySpec getSecretKey(final String key) {//返回生成指定算法密钥生成器的 KeyGenerator 对象KeyGenerator kg = null;try {kg = KeyGenerator.getInstance(KEY_ALGORITHM);//DES 要求密钥长度为 56kg.init(56, new SecureRandom(key.getBytes()));//生成一个密钥SecretKey secretKey = kg.generateKey();return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);// 转换为DES专用密钥} catch (NoSuchAlgorithmException ex) {Logger.getLogger(DESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}}

对称加密与非对称加密实战

文章插图
 
3DES加密3DES是一种对称加密算法 , 在 DES 的基础上 , 使用三重数据加密算法对数据进行加密 , 相当于是对每个数据块应用三次 DES 加密算法 。通过增加 DES 的密钥长度来避免类似的攻击 , 而不是设计一种全新的块密码算法这样来说 , 破解的概率就小了很多 。缺点由于使用了三重数据加密算法 , 比较耗性能 。
public class TripDESUtil {private static final String KEY_ALGORITHM = "DESede";private static final String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";//默认的加密算法/*** DESede 加密操作** @param content 待加密内容* @param key 加密密钥* @return 返回Base64转码后的加密数据*/public static String encrypt(String content, String key) {try {Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));// 初始化为加密模式的密码器byte[] result = cipher.doFinal(byteContent);// 加密return Base64.encodeBase64String(result);//通过Base64转码返回} catch (Exception ex) {Logger.getLogger(TripDESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}/*** DESede 解密操作** @param content* @param key* @return*/public static String decrypt(String content, String key) {try {//实例化Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);//使用密钥初始化 , 设置为解密模式cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));//执行操作byte[] result = cipher.doFinal(Base64.decodeBase64(content));return new String(result, "utf-8");} catch (Exception ex) {Logger.getLogger(TripDESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}/*** 生成加密秘钥** @return*/private static SecretKeySpec getSecretKey(final String key) {//返回生成指定算法密钥生成器的 KeyGenerator 对象KeyGenerator kg = null;try {kg = KeyGenerator.getInstance(KEY_ALGORITHM);//DESedekg.init(new SecureRandom(key.getBytes()));//生成一个密钥SecretKey secretKey = kg.generateKey();return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);// 转换为DESede专用密钥} catch (NoSuchAlgorithmException ex) {Logger.getLogger(TripDESUtil.class.getName()).log(Level.SEVERE, null, ex);}return null;}}


推荐阅读