`
annan211
  • 浏览: 463019 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java Aes 加密解密 字符串与字节数组转换

 
阅读更多
package com.duowan.yy.sysop.aes.decrypt;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
 * AES 加密/解密操作
 *
 * 加密思想 : 将二进制数据转换为16进制保存在数据库(为防止出错)   加密算法为 AES
 *
 * CRM 项目使用的是 NOpadding 模式(param:content,key,iv)
 * @author Administrator
 *
 */
public class AEScrypt {



    /**
     *
     * @param content 加密对象
     * @param key 密钥
     * @param iv IV
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(String content,String key,String iv) throws Exception {
        try {

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");

            int len = content.getBytes("UTF-8").length;
            int m = len % 16;
            if (m != 0) {
	            for (int i = 0; i < 16 - m; i++) {
	            	content += " ";
	            }
	        }
            byte[] dataBytes = content.getBytes();
            int plaintextLength = dataBytes.length;

            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);

            return encrypted;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     *
     * @param content 解密内容
     * @param key 解密密钥
     * @param iv IV
     * @return
     * @throws Exception
     */
    public static byte[] desEncrypt(byte[] content,String key,String iv) throws Exception {
        try
        {
            byte[] encrypted1 = content;

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);

            return original;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**解密
     * @param content  待解密内容
     * @param password 解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
            try {
                     KeyGenerator kgen = KeyGenerator.getInstance("AES");
                     kgen.init(128, new SecureRandom(password.getBytes()));
                     SecretKey secretKey = kgen.generateKey();
                     byte[] enCodeFormat = secretKey.getEncoded();
                     SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                     Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                    cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
                    byte[] result = cipher.doFinal(content);
                    return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
            } catch (InvalidKeyException e) {
                    e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
            } catch (BadPaddingException e) {
                    e.printStackTrace();
            }
            return null;
    }

    /**
     * 加密
     *
     * @param content 需要加密的内容
     * @param password  加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
            try {
                    KeyGenerator kgen = KeyGenerator.getInstance("AES");
                    kgen.init(128, new SecureRandom(password.getBytes()));
                    SecretKey secretKey = kgen.generateKey();
                    byte[] enCodeFormat = secretKey.getEncoded();
                    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                    Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                    byte[] byteContent = content.getBytes("utf-8");
                    cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
                    byte[] result = cipher.doFinal(byteContent);
                    return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
            } catch (InvalidKeyException e) {
                    e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
            } catch (BadPaddingException e) {
                    e.printStackTrace();
            }
            return null;
    }


    /**将16进制转换为二进制
	 * @param hexStr
	 * @return
	 */
	public static byte[] parseHexStr2Byte(String hexStr) {
	        if (hexStr.length() < 1)
	                return null;
	        byte[] result = new byte[hexStr.length()/2];
	        for (int i = 0;i< hexStr.length()/2; i++) {
	                int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
	                int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
	                result[i] = (byte) (high * 16 + low);
	        }
	        return result;
	}

	/**将二进制转换成16进制
	 * @param buf
	 * @return
	 */
	public static String parseByte2HexStr(byte buf[]) {
	        StringBuffer sb = new StringBuffer();
	        for (int i = 0; i < buf.length; i++) {
	                String hex = Integer.toHexString(buf[i] & 0xFF);
	                if (hex.length() == 1) {
	                        hex = '0' + hex;
	                }
	                sb.append(hex.toUpperCase());
	        }
	        return sb.toString();
	}

	/*
	* @return true---是Windows操作系统
	*/
	public static boolean isWindowsOS(){
	    boolean isWindowsOS = false;
	    String osName = System.getProperty("os.name");
	    if(osName.toLowerCase().indexOf("windows")>-1){
	      isWindowsOS = true;
	    }
	    return isWindowsOS;
	 }

	/**
	* 功能:判断一个字符串是否包含特殊字符
	* @param string 要判断的字符串
	* @return true 只包含指定字符范围 返回true
	*
	* @return false 含有指定字符之外的 返回false
	*/
	public static boolean isConSpeCharacters(String string) {
	   // TODO Auto-generated method stub
	   if(string.replaceAll("[a-z]*[A-Z]*[0-9]", "").length()==0){
	    //如果不包含特殊字符
	    return true;
	   }
	   return false;
	}

	public static boolean isMobiles(String string) {
		   // TODO Auto-generated method stub
		   if(string.replaceAll("[0-9]|-|-", "").trim().length()==0){
		    //如果不包含特殊字符
		    return true;
		   }
		   return false;
		}

	public static boolean isCharacter(String string) {
		   // TODO Auto-generated method stub
		   if(string.replaceAll("[a-z][A-Z]", "").trim().length()==0){
		    //如果不包含特殊字符
		    return true;
		   }
		   return false;
		}

}


分享到:
评论

相关推荐

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

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

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

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

    C#实现十六进制AES的加解密,字节数组工具类

    在C#中,可以使用BitConverter类将字节数组转换为十六进制字符串,反之亦然。 总结来说,C#实现的十六进制AES加解密结合了强大的加密算法和方便的数据表示方式,提供了可靠的数据安全解决方案。`ByteUtil.cs`和`...

    Java实现AES加密和解密算法

    `parseByte2HexStr`方法将字节数组转换为十六进制字符串,这允许在日志、存储或显示时以人类可读的形式表示加密数据。相反,`parseHexStr2Byte`方法将十六进制字符串转换回字节数组,以便于解密。 在实际应用中,...

    AES加密解密VC++源代码,任意长度字符串和文件加解密

    AES 加密的代码网上有很多,但是90%都只能对 16位字符串进行加密,经过两天的研究,修改完善了这个 可以对任意字符长度的字符串进行加密的VC++源代码,这个是本人努力的成果,像大家收点费用,希望谅解。 OK 制作 ...

    c/c++与java互通 AES加密解密

    总的来说,"C/C++与Java互通AES加密解密"是一个挑战性的任务,需要对加密算法、数据类型转换、内存管理以及跨平台通信有深入的理解。通过这个实践,开发者可以提升自己的编程技巧,并对数据安全有更深刻的认识。

    java使用Hex编码解码实现Aes加密解密功能示例

    在这个示例中,密钥首先是以字符串形式存在,然后通过`Hex.decodeHex()`方法将其从Hex编码转换回原始的字节数组,这是因为AES算法需要字节形式的密钥。如果密钥是经过Hex编码的,那么在使用之前必须进行解码。 接...

    JAVA实现AES加密和解密

    4. 将加密后的字节数组转换回字符串,可以使用Base64编码以方便存储和传输。 ```java String encodedCipherText = Base64.getEncoder().encodeToString(cipherTextBytes); ``` 解密过程与加密类似,只是在初始化`...

    AES加解密 解决了字符串结束标志0的问题.zip

    - 在加密前,将字符串转换成一个无`0`终止的字节数组,这样加密过程中不会受到`0`的影响。 - 在解密后,恢复字符串时重新添加`0`结束符,确保C风格字符串的正确性。 - 使用固定长度的缓冲区进行操作,确保无论字符串...

    AES.rar_AES 任意_AES任意字符串_字符串aes加密_字符串加密

    这样,我们就可以将字符串分成多个128位的块,然后逐个进行AES加密或解密。 AES的加密过程包括几个步骤:初始轮密钥扩展、多个轮的子密钥应用、字节替换(S盒操作)、行移位、列混淆以及最后的轮密钥加法。解密过程...

    Java AES128加密解密

    5. 将解密后的字节数组转换回原始字符串。 在实际开发中,为了提高安全性,通常会使用更复杂的密钥管理策略,例如密钥派生函数(KDF),以及密钥存储或共享机制。同时,由于AES-ECB模式的安全性限制,对于大段数据...

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

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

    aes.rar_AES C 文件_AES任意字符串_AES加密数组C_aes加密文件 c_aes长度过长

    总结来说,"aes.rar"中的内容提供了C语言实现的AES加密算法,支持任意长度的文件和字符串加密。通过对文件"aes.cpp"的分析和使用,开发者可以学习如何在C语言环境中高效且安全地应用AES加密技术。

    AES加解密字符串(字符串大小任意)

    2. **API接口**:可能定义了用于加密和解密字符串的函数,如`encrypt_string()`和`decrypt_string()`,这两个函数通常接受明文字符串和密钥作为输入,返回加密后的结果或解密后的明文。 3. **示例代码**:可能包含...

    QT C++ AES字符串加密解密类库,引入即可使用

    在QT C++中实现AES加密解密,开发者通常会使用如QCryptographicHash、QSslCipher等QT提供的安全库。类库可能包含以下关键部分: 1. 密钥和初始化向量(IV)的管理:AES加密需要一个密钥和一个可选的初始化向量。...

    Qt实现AES加密解密

    这个程序应当包含了上述知识点的具体应用,你可以通过阅读源代码、编译和运行来进一步理解和学习AES加密解密的实现细节。这个实战例程可以帮助开发者更好地掌握Qt环境下的加密解密操作,提高数据安全保护能力。

    AES实现字符串和文件加密

    在提供的`AesCode`文件中,很可能包含了实现AES加密的代码示例,这可能包括了密钥的生成、加密和解密的函数,以及如何处理字符串和文件的细节。通常,这样的代码库会提供API供开发者调用,以方便在项目中集成加密...

    AES加密解密JAVA实现(带源码)

    ### 知识点详解 #### 一、AES加密算法简介 **高级加密标准(Advanced Encryption Standard,AES)**是一种对称加密算法...通过以上介绍,我们可以了解到如何在Java中实现AES加密解密的基本流程,以及相关的注意事项。

    采用AES加密的16字节字符加密解密程序

    这个程序是由丁健使用Crypto++库在VC6环境下编写的,用于实现16字节字符的AES加密和解密功能。 Crypto++是一个开源的C++类库,包含了各种密码学算法,包括对称加密、非对称加密、哈希函数、消息认证码等。AES在...

    AES加密128位(16字节)CBC

    c# AES加密128位(16字节)CBC模式 NOPadding 网上代码好少16进制的所有贡献给大家

Global site tag (gtag.js) - Google Analytics