`
huiqinbo
  • 浏览: 344434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【java】AES加密解密|及Base64的使用 [转]

 
阅读更多

今天在网上看到一篇不错的博客,里面讲到加密及解密的信息。其实我在公司里面用到的和这几乎一样,为了涉及保密等东西就把这篇文章分享给大家。

   更多交流、更多了解:

   QQ:444084929 [回钦波]

    个人主面: http://www.huiqinbo.com

 

 

 

AES加解密算法,使用Base64做转码以及辅助加密:

package com.wintv.common;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/*******************************************************************************
 * AES加解密算法
 * 
 * 
@author arix04
 * 
 
*/

public class AES {

    
// 加密
    public static String Encrypt(String sSrc, String sKey) throws Exception {
        
if (sKey == null) {
            System.out.print(
"Key为空null");
            
return null;
        }
        
// 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print(
"Key长度不是16位");
            
return null;
        }
        
byte[] raw = sKey.getBytes();
        SecretKeySpec skeySpec 
= new SecretKeySpec(raw, "AES");           // 创建一个密钥
        Cipher cipher 
= Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);   //用密钥和一组算法参数初始化此 Cipher
        
byte[] encrypted = cipher.doFinal(sSrc.getBytes());   //按单部分操作加密或解密数据,或者结束一个多部分操作。

        
return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
    }

    
// 解密
    public static String Decrypt(String sSrc, String sKey) throws Exception {
        
try {
            
// 判断Key是否正确
            if (sKey == null) {
                System.out.print(
"Key为空null");
                
return null;
            }
            
// 判断Key是否为16位
            if (sKey.length() != 16) {
                System.out.print(
"Key长度不是16位");
                
return null;
            }
            
byte[] raw = sKey.getBytes("ASCII");
            SecretKeySpec skeySpec 
= new SecretKeySpec(raw, "AES");
            Cipher cipher 
= Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv 
= new IvParameterSpec("0102030405060708"
                    .getBytes());
            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) {
                System.out.println(e.toString());
                
return null;
            }
        } 
catch (Exception ex) {
            System.out.println(ex.toString());
            
return null;
        }
    }

    
public static void main(String[] args) throws Exception {
        
/*
         * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
         * 此处使用AES-128-CBC加密模式,key需要为16位。
         
*/
        String cKey 
= "1234567890123456";
        
// 需要加密的字串
        String cSrc = "Email : arix04@xxx.com";
        System.out.println(cSrc);
        
// 加密
        long lStart = System.currentTimeMillis();
        String enString 
= AES.Encrypt(cSrc, cKey);
        System.out.println(
"加密后的字串是:" + enString);

        
long lUseTime = System.currentTimeMillis() - lStart;
        System.out.println(
"加密耗时:" + lUseTime + "毫秒");
        
// 解密
        lStart = System.currentTimeMillis();
        String DeString 
= AES.Decrypt(enString, cKey);
        System.out.println(
"解密后的字串是:" + DeString);
        lUseTime 
= System.currentTimeMillis() - lStart;
        System.out.println(
"解密耗时:" + lUseTime + "毫秒");
    }
}

 

AES加解密算法,使用byte2hex做转码:

package com.wintv.common;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/*******************************************************************************
 * AES加解密算法
 * 
 * 
@author arix04
 * 
 
*/

public class AES {

    
// 加密
    public static String Encrypt(String sSrc, String sKey) throws Exception {
        
if (sKey == null) {
            System.out.print(
"Key为空null");
            
return null;
        }
        
// 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print(
"Key长度不是16位");
            
return null;
        }
        
byte[] raw = sKey.getBytes();
        SecretKeySpec skeySpec 
= new SecretKeySpec(raw, "AES");
        Cipher cipher 
= Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv 
= new IvParameterSpec("0102030405060708".getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        
byte[] encrypted = cipher.doFinal(sSrc.getBytes());

        
return byte2hex(encrypted).toLowerCase();
    }

    
// 解密
    public static String Decrypt(String sSrc, String sKey) throws Exception {
        
try {
            
// 判断Key是否正确
            if (sKey == null) {
                System.out.print(
"Key为空null");
                
return null;
            }
            
// 判断Key是否为16位
            if (sKey.length() != 16) {
                System.out.print(
"Key长度不是16位");
                
return null;
            }
            
byte[] raw = sKey.getBytes("ASCII");
            SecretKeySpec skeySpec 
= new SecretKeySpec(raw, "AES");
            Cipher cipher 
= Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv 
= new IvParameterSpec("0102030405060708"
                    .getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            
byte[] encrypted1 = hex2byte(sSrc);
            
try {
                
byte[] original = cipher.doFinal(encrypted1);
                String originalString 
= new String(original);
                
return originalString;
            } 
catch (Exception e) {
                System.out.println(e.toString());
                
return null;
            }
        } 
catch (Exception ex) {
            System.out.println(ex.toString());
            
return null;
        }
    }

    
public static byte[] hex2byte(String strhex) {
        
if (strhex == null) {
            
return null;
        }
        
int l = strhex.length();
        
if (l % 2 == 1) {
            
return null;
        }
        
byte[] b = new byte[l / 2];
        
for (int i = 0; i != l / 2; i++) {
            b[i] 
= (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2),
                    
16);
        }
        
return b;
    }

    
public static String byte2hex(byte[] b) {
        String hs 
= "";
        String stmp 
= "";
        
for (int n = 0; n < b.length; n++) {
            stmp 
= (java.lang.Integer.toHexString(b[n] & 0XFF));
            
if (stmp.length() == 1) {
                hs 
= hs + "0" + stmp;
            } 
else {
                hs 
= hs + stmp;
            }
        }
        
return hs.toUpperCase();
    }

    
public static void main(String[] args) throws Exception {
        
/*
         * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
         
*/
        String cKey 
= "1234567890123456";
        
// 需要加密的字串
        String cSrc = "Email : arix04@xxx.com";
        System.out.println(cSrc);
        
// 加密
        long lStart = System.currentTimeMillis();
        String enString 
= AES.Encrypt(cSrc, cKey);
        System.out.println(
"加密后的字串是:" + enString);

        
long lUseTime = System.currentTimeMillis() - lStart;
        System.out.println(
"加密耗时:" + lUseTime + "毫秒");
        
// 解密
        lStart = System.currentTimeMillis();
        String DeString 
= AES.Decrypt(enString, cKey);
        System.out.println(
"解密后的字串是:" + DeString);
        lUseTime 
= System.currentTimeMillis() - lStart;
        System.out.println(
"解密耗时:" + lUseTime + "毫秒");
    }
}
分享到:
评论

相关推荐

    java aes加密转换Base64 使用 CBC 解密模式

    java AES加密解密,使用 CBC 解密模式,EncryptByAes Aes加密 后 base64 再加 DecryptByAes Aes 解密,对 PKCS7 填充的数据进行反填充,对数据进行 PKCS7 填充 使用 CBC 解密模式, // aesDecrypt 解密 public ...

    AES加密解密 Base64加密解密

    java代码实例 AES加密解密 Base64加密解密

    Base64转码,AES加密解密,IOS,Android,Java

    Base64转码,AES加密解密,IOS,Android,Java 后台。 本工程可以直接使用,而且与IOS,Android,JAVA 已调通。 主要用于客户端进行通信,数据之间地安全性。对数据进行加密和解密。 适用于银行等较为保密的项目中。 ...

    java实现SHA1、SHA、MD5、AES加密、AES解密、BASE64解密、BASE64加密,以及BASE64 jar和源码

    在这个压缩包中,包含的资源可以帮助我们理解并实现SHA1、SHA、MD5、AES加密与解密,以及BASE64编码和解码。下面我们将详细探讨这些加密算法和它们在Java中的实现。 1. **SHA(Secure Hash Algorithm)**: SHA是一...

    微信小程序 AES ECB base64 加密解密

    在IT行业中,加密技术是确保数据安全的重要手段。...总的来说,理解并正确使用AES ECB Base64加密解密是微信小程序开发中保障数据安全的关键。通过合理的加密策略和安全实践,可以有效防止数据泄露,保护用户隐私。

    JAVA实现AES加密和解密

    总的来说,理解并正确使用Java实现AES加密和解密,需要注意秘钥的生成、工作模式的选择、填充方式以及字符编码的一致性,这样才能确保数据的安全传输和正确解密。通过实际操作和实践,你可以更深入地掌握这些知识点...

    Java AES128加密解密

    在Java中实现AES128加密解密,通常会使用Java Cryptography Extension (JCE) 提供的API。AES支持三种工作模式:ECB(Electronic Codebook)、CBC(Cipher Block Chaining)和CFB(Cipher Feedback)。其中,ECB是最...

    VB6.0 RSA/AES/Md5/Base64加密 解密 微信小程序 javascript 通用

    标题中的“VB6.0 RSA/AES/Md5/Base64加密 解密 微信小程序 javascript 通用”表明这是一个关于编程的示例项目,主要涵盖了四种加密和解密技术:RSA、AES、MD5和Base64。这些技术在信息安全领域广泛应用于数据保护和...

    JAVA AES加密解密

    * 编码工具类 * 1.将byte[]转为各种进制的字符串 * 2.base 64 encode * 3.base 64 decode ...结合base64实现md5加密 * 7.AES加密 * 8.AES加密为base 64 code * 9.AES解密 * 10.将base 64 code AES解密

    java前后端通讯AES加密及解密样例

    通过这个案例,我们可以看到在Spring Boot项目中实现AES加密解密的基本步骤。然而,实际项目中还应考虑其他安全措施,例如使用HTTPS协议、密钥的动态生成和安全存储、以及对称加密与非对称加密的结合使用等,以增强...

    Java AES加密解密

    在Java中实现AES加密解密,我们需要使用Java Cryptography Extension (JCE)库。以下是一些关键知识点: 1. 导入相关库: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import...

    AES JS加密JAVA解密

    在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程。下面我们将深入探讨这个主题。 首先,AES加密的基本原理是通过一个密钥和一系列复杂的...

    JAVA实现AES加密解密工具类

    总之,AES加密解密工具类在Java中实现涉及对Cipher类的熟练使用,理解加密模式和填充策略,以及正确管理和生成密钥和初始化向量。这个工具类使得开发者能够方便地在项目中集成加密功能,保障数据的安全。

    微信小程序base64 Aes加解密

    本文将详细介绍如何在微信小程序中使用Base64和AES加密技术来增强数据安全性。 一、Base64编码 Base64是一种用于在网络上传输二进制数据的编码方式。它将每3个字节的数据转换为4个字符的文本字符串。在微信小程序中...

    java 基于AES实现对文件的加密 解密

    在实现AES加密解密时,要特别注意错误处理和数据完整性检查。例如,确保文件读取和写入的正确性,以及在解密过程中处理可能的异常。此外,www.willvc.com.cn 提供的资源可能是进一步学习和解决问题的途径。 总之,...

    java AES加密 解决加密过长非法异常问题

    - 最后,如果需要,可以将加密后的字节数组转换回字符串,例如使用Base64编码。 2. **基于字节数组的AES加密**: - 这种方式与字符串加密类似,只是输入和输出都是字节数组,无需进行字符串编码和解码。 - 在...

    java后台及前端js使用AES互相加解密及前端md5加密

    通常,Java使用字节数组表示密钥,而JavaScript使用Base64编码的字符串,因此在前后端之间传递密钥时,需要进行适当的转换。 6. **安全实践**:虽然AES和MD5在很多场景下被广泛使用,但值得注意的是,MD5已经不被...

    AES实现前端JS和后端java加密解密

    后端Java实现AES加密解密: 1. **导入依赖**:在Java中,我们需要添加Apache Commons Codec库来处理Base64编码,以及Java Cryptography Extension (JCE)来支持AES操作。确保JCE未受限制,因为默认情况下,Java对某些...

    Delphi7AES加密解密与JAVA互转(默认128位+ECB+PKCS5Padding+先BASE64再HEX)

    在这里,我们特别关注128位密钥长度的AES加密,使用ECB(Electronic Codebook)模式,配合PKCS5Padding填充策略,以及数据编码的BASE64和HEX转换。 首先,AES加密是一种分组密码,它将明文数据分成固定大小的块进行...

    java,php,GOLang,JavaScript,AES加密解密代码互通

    总的来说,跨语言的AES加密解密互通需要对各种语言的加密API有深入理解,并保持一致性以确保数据安全地在不同环境中传输。这个主题对于开发跨平台应用和微服务架构的开发者来说,是一个非常实用的知识点。

Global site tag (gtag.js) - Google Analytics