牛骨文教育服务平台(让学习变的简单)
博文笔记

AES 加密后进行 BASE64 转码

创建时间:2015-01-21 投稿人: 浏览次数:3652

今天第一次使用到加密,所以有些摸不着头脑,百度后,经测试,加密后的结果和文档中的不一致;

加密模式:AES/CBC/PKCS5Padding 

加密初始化向量:长度为 16 的空字节数组 

以上是加密规则,琢磨了半天,原来 IvParameterSpec iv = new IvParameterSpec(srcIv);构造函数是一个16位长的空字节数组,开始时是16位字符串,所以生成结果就和规定的不一样。


public class AES {
    
    private String sKey="1234567890123456";
    
    byte[] srcIv=new byte[16];
   


    //加密
    public String Encrypt(String sSrc) throws Exception{
        
        if(sKey == null || sKey.length() != 16){
            
            throw new Exception("sKey为空");
        }
        
        byte[] raw=sKey.getBytes();
        
        SecretKeySpec skeySpec=new SecretKeySpec(raw,"AES");
        
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        
        IvParameterSpec iv = new IvParameterSpec(srcIv);
        
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec,iv);
        
        byte[] encrypted = cipher.doFinal(sSrc.getBytes());
        
        return new BASE64Encoder().encode(encrypted);
        
    }
    
    // 解密
    public String Decrypt(String sSrc) throws Exception {
        try {
            // 判断Key是否正确
            if (sKey == null || sKey .length() != 16) {
                
                throw new Exception("sKey为空或不是16位");
            }
            
            byte[] raw = sKey.getBytes("ASCII");
            
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            
            IvParameterSpec iv = new IvParameterSpec(srcIv);
            
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
            
            try {
                
                byte[] original = cipher.doFinal(encrypted1);
                
                String originalString = new String(original);
               
                return originalString;
                
            } catch (Exception e) {
                
                LogUtil.info(LogConstants.App, e.getMessage());
                
                return null;
            }
            
        } catch (Exception ex) {
            
            LogUtil.info(LogConstants.App, ex.getMessage());
            
            return null;
        }
    }
}


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。