zoukankan      html  css  js  c++  java
  • Java常用加密方案及实现——AES和DES

      AES和DES都是对称加密算法,其中DES全称为Data Encryption Standard,AES全称为Advanced Encryption Standard即高级加密标准。

      DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。而AES高级加密标准已然成为对称密钥加密中最流行的算法之一。在我们的实际开发中,现在更建议选择AES算法。

      下面是维基百科对两者的解释:DESAES,由于AES的实用性和安全性以及性能,这里只给出AES的代码实现,DES的Java实现会面给出参考链接。

      

     1 package com.****.common.util;
     2 
     3 import java.io.IOException;
     4 import java.io.UnsupportedEncodingException;
     5 import java.security.SecureRandom;
     6 
     7 import javax.crypto.Cipher;
     8 import javax.crypto.KeyGenerator;
     9 import javax.crypto.SecretKey;
    10 import javax.crypto.spec.SecretKeySpec;
    11 
    12 import org.apache.log4j.LogManager;
    13 import org.apache.log4j.Logger;
    14 
    15 
    16 
    17 
    18 
    19 public class AESUtil {
    20 
    21     private static final Logger log = LogManager.getLogger(AESUtil.class);
    22     
    23 
    24     
    25     /**
    26      * @Description: AES加密 
    27      * @author wang
    28      * @date 2017-7-30 下午03:42:47
    29      * @param content 需要加密的内容 
    30      * @param password  加密密钥 
    31      * @return
    32      */
    33     public static String encrypt(String content, String AESKey){
    34         try{
    35             KeyGenerator kgen = KeyGenerator.getInstance("AES");  
    36             SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
    37             random.setSeed(AESKey.getBytes());
    38             
    39             kgen.init(128, random);  
    40             SecretKey secretKey = kgen.generateKey();  
    41             byte[] enCodeFormat = secretKey.getEncoded();  
    42             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  
    43             Cipher cipher = Cipher.getInstance("AES");// 创建密码器   
    44             byte[] byteContent = content.getBytes("utf-8");  
    45             cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化   
    46             
    47             byte[] encryptResult = cipher.doFinal(byteContent);    //加密后接口
    48             
    49             String result = Base64.encodeBytes(encryptResult);
    50             return result; // 加密
    51         }catch (Exception e){
    52             log.error("AES加密时出现异常:【content:"+content+";AESPwd:"+AESKey+"】",e);
    53         }
    54         return null; 
    55     }
    56     
    57     /**
    58      * 
    59      * @Description: AES解密
    60      * @author wang
    61      * @date 2017-7-30 下午04:05:32
    62      * @param content  待解密内容
    63      * @param password 解密密钥
    64      * @return
    65      */
    66     public static String decrypt(String content, String AESKey){
    67         try{
    68             byte[] contentByte = Base64.decode(content);// 先用base64解密  
    69             KeyGenerator kgen = KeyGenerator.getInstance("AES");
    70             SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
    71             random.setSeed(AESKey.getBytes());
    72             
    73             kgen.init(128, random);
    74             SecretKey secretKey = kgen.generateKey();
    75             byte[] enCodeFormat = secretKey.getEncoded();
    76             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
    77             Cipher cipher = Cipher.getInstance("AES");// 创建密码器   
    78             cipher.init(Cipher.DECRYPT_MODE, key);// 初始化   
    79             byte[] result = cipher.doFinal(contentByte);
    80             return new String(result,"utf-8"); // 解密
    81         }catch(Exception e){
    82             log.error("AES解密时出现异常:[content:"+content+";AESPwd:"+AESKey+"]");
    83         }
    84         return null;
    85     }
    86     
    87     
    88     //test 
    89     public static void main(String[] args) throws IOException {
    90         String a = "JDE1234567891234567891_abcd-1234-abcd-1234";
    91         String aesKey="JDE1234567891234567891";
    92         String encodeStr = encrypt(a,aesKey);
    93         System.out.println(encodeStr);
    94         String decodeStr = decrypt(encodeStr,aesKey);
    95         System.out.println(decodeStr);
    96     }
    97 }

      运行结果:

      

      延伸一点:关于AES加密后得到的密文的长度,我在网上看到的有一种解释是密文长度只和明文长度有关,和秘钥长无关,但是根据代码的实际运行情况看不是这样,而是和明文以及秘钥都有关。关于密文长度问题,欢迎大家一起讨论。

      关于DES的Java代码实现:参考这里

  • 相关阅读:
    软件 = 程序 + 软件工程(构建之法读书笔记一)
    网站系统开发需要掌握的技术
    C++迪杰斯特拉算法求最短路径
    strcpy函数在VS2015无法使用的问题
    C++哈夫曼树编码和译码的实现
    java学习中一些疑惑解答(2)
    凯撒加密、解密算法
    利用DOS批处理实现定时关机操作
    C及C++中typedef的简单使用指南
    java学习中的一些疑惑解答
  • 原文地址:https://www.cnblogs.com/guodongdidi/p/7258710.html
Copyright © 2011-2022 走看看