`
annan211
  • 浏览: 445537 次
  • 性别: 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加密和解密算法

    本文就简单介绍如何通过JAVA实现AES加密: /** * 测试AES加密和解密 * @param args */ public static void main(String[] args) { ...加密后的字节数组不能直接转化为字符串,需要我们通过给出的两个方法转化;

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

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

    AES加密128位(16字节)CBC

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

    python实现AES加密解密

    开始的字符串就是输入的明文,第一个矩阵,是明文对应的状态矩阵,下面的字典是得到的经过扩展后的密钥,再下面的矩阵是经过加密之后的矩阵,最后的矩阵就是解密之后的矩阵,最后的输出就是还原的明文,可以发现AES...

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

    采用了crypto++的密码算法库做的aes的字符加密解密程序,vc6环境,字符数目16位,密钥可变换。作者:丁健

    AES加密解密C++程序

    资源分设的高了,因为本人搞这个程序花了很大的力气,大家见谅啊~~~不过本人保证此程序可以使用,是C++版的。C版的以后搞定再上传。本程序只对16字节加解密,...注意被处理的字符串或者数组长度要补齐为16的整数倍。

    java AES加解密方式

    AESServiceECB.jar 实现了AES的ECB模式下的算法,允许对字符串、字节、文件的加密。 提示:Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在...

    aesjava源码-java-aes-crypto:用于加密和解密字符串的简单Android类,旨在避免大多数此类类所遭受的经典错误

    用于加密和解密字符串的简单 Android 类,旨在避免大多数此类类受到影响。 特征 下面是这个类的特点。 我们相信这些属性与很多人在 Android 中加密字符串时所寻求的一致。 适用于字符串:它应该加密任意字符串或字节...

    AES加密与解密软件_最新版(2.2.2与2.2.3版 速度与性能上有较大提高).rar

    现在你在加密/解密字符串页面下按下回车键,软件会根据当前的状态自动调用加密与解密函数以实现加密或解密的功能;在加密/解密单文件页面下按下回车键,软件会根据你在按回车键之前最近的几次操作(如:更改待加密...

    AES+CTR+NoPadding

    (1)对称加密主要应用于普通的数据块(如字符串、字节流等)加解密。 (2)CTR模式支持加/解密并行操作;而cBc模式加密不支持并行操作,解密支持并行 操作。因而,CTR模式加密速度快于CBC模式。

    RSA、AES、RC4、ECC等加密算法性能分析

    本demo用C# 实现了了AES、RSA、DES、RC4、ECC加密解密方法,同时分析了几个加密解密的性能 其中用来加密的源字符串为随机生成的10字节 1KB,10KB 100KB的字符串

    AES加密算法VC源代码

    根据rijndael AES算法描述及其演示flash编写的VC源码,实现了对16字节长度字符串的加解密过程和任意长度文件的加解密过程。

    aesjava源码-AESCipher-Java:Objective-C和Java之间的AES加密

    aes java源码AESCipher-Java Java AES 加密 将此代码用于Android和Java 后端以及iOS可以让您准确地使用 AES 加密和解密。 加密: ...解密: ...字节字符串修改IV_STRING ,但您应该确保将其与第 14 行

    rsa-aes-utils:RSA、AES 加解密,支持 JavaScript 、Node.js、Java

    RSA、AES 加解密,浏览器端 JS 加密,服务端 nodejs、java 解密。 加解密介绍 加密算法分对称加密和非对称算法,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不...

    Java文件加解密工具

    JavaSwing 字符串、文件加解密工具源码。支持字符流,字节流,分段加密。支持对称AES,DES,非对称RSA等加密,输出格式支持HEX,Base64,二进制流等

    openssl evp aes 加解密算法调试例程

    openssl接口加密的是数据,不限制是否为字符串,我看到有些人在加密时使用strlen(),来获取要加密的长度,如果是对字符串加密的话没有问题,如果不是字符串的话,用它获取的长度是到第一个0处,因为这个函数获取的...

    C# 辅助工具类,winform、.Core、.Net工具栏(字符处理,序列化,日志,加解密,文件,验证码,换算,具体如下等等)

    日期处理// 时间处理// 时间戳// Unix 时间换算// 时间 - 周 换算// AES 加密解密// DES 加密解密// MD5 原生算法// MD5 算法(依赖系统)// 标志枚举运算// Guid 格式处理// 模型序列化// 字符串处理(StringTool)...

    android-crypt-helper.zip

    Base64.java及Hex.java:字符串与字节码转换工具。 Base64如报错,请用security中的jar文件换掉JRE/lib/security中的jar包。 PS: 作者GitHub,https://github.com/panxw, 欢迎来Follow~ 标签:...

    AES-CBC-PKCS7Padding-:AESCBCPKCS7Padding加密的实现

    Python需要安Crypto库(pip install pycrypto或访问)PHP需要安装mcrypt扩展说明加密模式采用AES/CBC/PKCS7Padding注意:加密后的字节码使用Base64转换成字符串加密模式: CBC填充模式: PKCS7Padding加密密钥: 用户密钥...

    128位AES加密算法C语言实现

    用C语言实现的128位AES加密算法,可以运行在JAVA的JNI 中AIS加密算法c语言实现代码 nt cnt for(ent =0: cnt&lt; 8: cnt++) BvtcToBit(*(ch+cnt), bit+(ent&lt;&lt;3)) return /将二进制位串转为长度为8的字符串水 ...

Global site tag (gtag.js) - Google Analytics