`
wxiaoneng
  • 浏览: 8554 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

AES加密解密|及Base64的使用

    博客分类:
  • java
阅读更多
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);
        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 + "毫秒");
    }
}

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),
);
        }
        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 + "毫秒");
    }
}

分享到:
评论

相关推荐

    AES加密解密 Base64加密解密

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

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

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

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

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

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

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

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

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

    微信小程序base64 Aes加解密

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

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

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

    C#实现AES加密解密算法

    ### C# 实现 AES 加密解密算法 #### 概述 在计算机科学与信息安全领域,数据加密技术是一项至关重要的技术。AES(Advanced Encryption Standard,高级加密标准)是一种广泛使用的对称加密算法,用于保护敏感数据的...

    AES加密解密算法 iOS和Android完美实现

    在iOS平台上,我们可以使用Security框架来实现AES加密解密。首先,需要导入`#import &lt;CommonCrypto/CommonCryptor.h&gt;`头文件,然后使用`CCCrypt`函数进行加密和解密操作。这里的关键步骤包括:选择加密算法(如...

    本地图片AES加密解密

    "本地图片AES加密解密"是一个针对这个问题提出的技术方案,旨在保护存储在本地设备上的图片不被未经授权的第三方访问。AES(Advanced Encryption Standard)加密是一种广泛应用的对称加密算法,因其高效和安全性而...

    AES加密解密 for vba

    ' 功能: AES加密解密 password&lt;==&gt;hwWpiegaWDeE8kTlb/5BQg== , 8705a989e81a583784f244e56ffe4142 ' [Str] 预备转换的byte ' [StrKey] 16位的密钥 ' [StrIv] 16位的偏移 ' [Encrypt] 加密(缺省值)还是解密 ' ...

    微信小程序base64加密,AES加密

    在这个特定的场景下,我们讨论的是在微信小程序中进行数据加密,包括base64编码和AES加密。这两种技术在数据安全领域扮演着重要角色。 首先,让我们了解一下Base64编码。Base64是一种将二进制数据转换为可打印ASCII...

    不用cryptoJs的aes加密解密

    总之,不依赖cryptoJs的AES加密解密是通过自定义的JavaScript代码完成的,涉及的关键步骤包括密钥扩展、填充、字节到状态的转换、加密/解密过程以及Base64编码/解码。如果你需要在项目中实现这种功能,你需要深入...

    Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    实现了AES/ECB/PKCS5Padding、AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充。是标准的AES算法,支持在线AES加解密网站...需要注意的是仅在XE及以上版本支持Base64返回结果,Delphi7的base64不能直接支持。

    jquery实现aes加密,后端php解密

    在jQuery中,可以如下使用crypto-js进行AES加密: ```javascript var key = CryptoJS.lib.WordArray.random(16); // 生成128位随机密钥 var iv = CryptoJS.lib.WordArray.random(16); // 生成128位随机初始化向量 ...

    Base64 个性化加密解密功能VB源码

    至于“个性化加密解密功能”,这可能指的是在Base64的基础上增加额外的加密层,如使用AES、RSA等加密算法。在VB中,可以使用.NET Framework提供的`System.Security.Cryptography`命名空间下的类来实现。例如,如果...

    android Aes 加密解密

    总的来说,理解并正确应用AES加密解密,尤其是结合PKCS7Padding填充和位移量,对于保护Android应用中的敏感数据至关重要。而Base64编码则为加密结果提供了一个可读且可传输的形式。在实际开发中,应确保遵循最佳实践...

    AES加密 BASE64测试代码

    总的来说,这个项目提供了一个使用AES128加密和Base64编码的小型测试框架,适用于理解和学习这两种技术的结合。对于开发者来说,这是一个很好的起点,可以在此基础上扩展到更复杂的加密场景,比如使用更安全的加密...

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

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

    DelphiXE10.3与Java互通AES加解密算法,亲测可用.zip

    DelphiXE10.3与Java互通AES加解密算法,亲测可用。支持ECB、CBC算法,支持128、192、256密匙长度,支持密匙和向量设置,支持补码方式PKCS5和PKCS7,支持16进制密文和Base64密文。

Global site tag (gtag.js) - Google Analytics