Java加密解密工具(适用于JavaSE/JavaEE/Android)_java

本文实例为大家分享了一个适用于JavaSE/JavaEE/Android的Java加密解密工具,供大家学习,具体内容如下

package longshu.utils.security;

import java.lang.reflect.Method;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
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.SecretKeySpec;

/**
 * Java加密解密工具.
 * JavaSE/JavaEE/Android都适用
 *
 * @author longshu 2016年4月13日
 */
public class EncryptDecrypt {
 // 无需创建对象
 private EncryptDecrypt() {
 }

 /**
  * SHA1加密Bit数据
  * @param source byte数组
  * @return 加密后的byte数组
  */
 public static byte[] SHA1Bit(byte[] source) {
  try {
   MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");
   sha1Digest.update(source);
   byte targetDigest[] = sha1Digest.digest();
   return targetDigest;
  } catch (NoSuchAlgorithmException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * SHA1加密字符串数据
  * @param source 要加密的字符串
  * @return 加密后的字符串
  */
 public static String SHA1(String source) {
  return byte2HexStr(SHA1Bit(source.getBytes()));
 }

 /**
  * MD5加密Bit数据
  * @param source byte数组
  * @return 加密后的byte数组
  */
 public static byte[] MD5Bit(byte[] source) {
  try {
   // 获得MD5摘要算法的 MessageDigest对象
   MessageDigest md5Digest = MessageDigest.getInstance("MD5");
   // 使用指定的字节更新摘要
   md5Digest.update(source);
   // 获得密文
   return md5Digest.digest();
  } catch (NoSuchAlgorithmException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * MD5加密字符串,32位长
  * @param source 要加密的内容
  * @return 加密后的内容
  */
 public static String MD5(String source) {
  return byte2HexStr(MD5Bit(source.getBytes()));
 }

 /**
  * BASE64编码
  * @param source 要编码的字符串
  * @return 编码过的字符串
  */
 public static String encodeBASE64(String source) {
  Class<?> clazz = null;
  Method encodeMethod = null;
  try {// 优先使用第三方库
   clazz = Class.forName("org.apache.commons.codec.binary.Base64");
   encodeMethod = clazz.getMethod("encodeBase64", byte[].class);
   System.out.println("encodeBASE64-->" + clazz);
   System.out.println("encodeMethod-->" + encodeMethod);
   // 反射方法 静态方法执行无需对象
   return new String((byte[]) encodeMethod.invoke(null, source.getBytes()));
  } catch (ClassNotFoundException e) {
   String vm = System.getProperty("java.vm.name");
   System.out.println(vm);
   try {
    if ("Dalvik".equals(vm)) {// Android
     clazz = Class.forName("android.util.Base64");
     // byte[] Base64.encode(byte[] input,int flags)
     encodeMethod = clazz.getMethod("encode", byte[].class, int.class);
     System.out.println("encodeBASE64-->" + clazz);
     System.out.println("encodeMethod-->" + encodeMethod);
     return new String((byte[]) encodeMethod.invoke(null, source.getBytes(), 0));
    } else {// JavaSE/JavaEE
     clazz = Class.forName("sun.misc.BASE64Encoder");
     encodeMethod = clazz.getMethod("encode", byte[].class);
     System.out.println("encodeBASE64-->" + clazz);
     System.out.println("encodeMethod-->" + encodeMethod);
     return (String) encodeMethod.invoke(clazz.newInstance(), source.getBytes());
    }
   } catch (ClassNotFoundException e1) {
    return null;
   } catch (Exception e1) {
    return null;
   }
  } catch (Exception e) {
   return null;
  }
  /*
   * Android
   * android.util.Base64
   */
  // return Base64.encodeToString(source, Base64.DEFAULT);
  // return new String(Base64.encode(source.getBytes(), Base64.DEFAULT));

  /*
   * JavaSE/JavaEE
   */
  // sun.misc.BASE64Encoder
  // BASE64Encoder encoder = new BASE64Encoder();
  // return encoder.encode(source.getBytes());

  // org.apache.commons.codec.binary.Base64
  // return new String(Base64.encodeBase64(source.getBytes()));
 }

 /**
  * BASE64解码
  * @param encodeSource 编码过的字符串
  * @return 编码前的字符串
  */
 public static String decodeBASE64(String encodeSource) {
  Class<?> clazz = null;
  Method decodeMethod = null;

  try {// 优先使用第三方库
   clazz = Class.forName("org.apache.commons.codec.binary.Base64");
   decodeMethod = clazz.getMethod("decodeBase64", byte[].class);
   System.out.println("decodeBASE64-->" + clazz);
   System.out.println("decodeMethod-->" + decodeMethod);
   // 反射方法 静态方法执行无需对象
   return new String((byte[]) decodeMethod.invoke(null, encodeSource.getBytes()));
  } catch (ClassNotFoundException e) {
   String vm = System.getProperty("java.vm.name");
   System.out.println(vm);
   try {
    if ("Dalvik".equals(vm)) {// Android
     clazz = Class.forName("android.util.Base64");
     // byte[] Base64.decode(byte[] input, int flags)
     decodeMethod = clazz.getMethod("decode", byte[].class, int.class);
     System.out.println("decodeBASE64-->" + clazz);
     System.out.println("decodeMethod-->" + decodeMethod);
     return new String((byte[]) decodeMethod.invoke(null, encodeSource.getBytes(), 0));
    } else { // JavaSE/JavaEE
     clazz = Class.forName("sun.misc.BASE64Decoder");
     decodeMethod = clazz.getMethod("decodeBuffer", String.class);
     System.out.println("decodeBASE64-->" + clazz);
     System.out.println("decodeMethod-->" + decodeMethod);
     return new String((byte[]) decodeMethod.invoke(clazz.newInstance(), encodeSource));
    }
   } catch (ClassNotFoundException e1) {
    return null;
   } catch (Exception e1) {
    return null;
   }
  } catch (Exception e) {
   return null;
  }
  /*
   * Android
   * android.util.Base64
   */
  // return new
  // String(Base64.decode(encodeSource.getBytes(),Base64.DEFAULT));

  /*
   * JavaSE/JavaEE
   */
  // sun.misc.BASE64Decoder
  // try {
  // BASE64Decoder decoder = new BASE64Decoder();
  // return new String(decoder.decodeBuffer(encodeSource));
  // } catch (IOException e) {
  // throw new RuntimeException(e);
  // }

  // org.apache.commons.codec.binary.Base64
  // return new String(Base64.decodeBase64(encodeSource.getBytes()));
 }

 /**
  * AES加密
  * @param content 待加密的内容
  * @param password 加密密码
  * @return
  */
 public static byte[] encryptBitAES(byte[] content, String password) {
  try {
   Cipher encryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
   encryptCipher.init(Cipher.ENCRYPT_MODE, getKey(password));// 初始化
   byte[] result = encryptCipher.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;
 }

 /**
  * AES解密
  * @param content 待解密内容
  * @param password 解密密钥
  * @return
  */
 public static byte[] decryptBitAES(byte[] content, String password) {
  try {
   Cipher decryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
   decryptCipher.init(Cipher.DECRYPT_MODE, getKey(password));// 初始化
   byte[] result = decryptCipher.doFinal(content);
   return result; // 加密结果
  } catch (InvalidKeyException e) {
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  } catch (NoSuchPaddingException e) {
   e.printStackTrace();
  } catch (IllegalBlockSizeException e) {
   e.printStackTrace();
  } catch (BadPaddingException e) {
   e.printStackTrace();
  }
  return null;
 }

 /**
  * AES字符串加密
  * @param content 待加密的内容
  * @param password 加密密码
  * @return
  */
 public static String encryptAES(String content, String password) {
  return byte2HexStr(encryptBitAES(content.getBytes(), password));
 }

 /**
  * AES字符串解密
  * @param content 待解密内容
  * @param password 解密密钥
  * @return
  */
 public static String decryptAES(String content, String password) {
  return new String(decryptBitAES(hexStr2Bytes(content), password));
 }

 /**
  * 从指定字符串生成密钥
  * @param password 构成该秘钥的字符串
  * @return 生成的密钥
  * @throws NoSuchAlgorithmException
  */
 private static Key getKey(String password) throws NoSuchAlgorithmException {
  SecureRandom secureRandom = new SecureRandom(password.getBytes());
  // 生成KEY
  KeyGenerator kgen = KeyGenerator.getInstance("AES");
  kgen.init(128, secureRandom);
  SecretKey secretKey = kgen.generateKey();
  byte[] enCodeFormat = secretKey.getEncoded();
  // 转换KEY
  SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
  return key;
 }

 /**
  * 将byte数组转换为表示16进制值的字符串.
  * 如:byte[]{8,18}转换为:0812
  * 和 byte[] hexStr2Bytes(String strIn) 互为可逆的转换过程.
  * @param bytes 需要转换的byte数组
  * @return 转换后的字符串
  */
 public static String byte2HexStr(byte[] bytes) {
  int bytesLen = bytes.length;
  // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
  StringBuffer hexString = new StringBuffer(bytesLen * 2);
  for (int i = 0; i < bytesLen; i++) {
   // 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制
   String hex = Integer.toHexString(bytes[i] & 0xFF);
   if (hex.length() < 2) {
    hexString.append(0);// 如果为1位 前面补个0
   }
   hexString.append(hex);
  }
  return hexString.toString();
 }

 /**
  * 将表示16进制值的字符串转换为byte数组,
  * 和 String byte2HexStr(byte[] bytes) 互为可逆的转换过程.
  * @param bytes
  * @return 转换后的byte数组
  */
 public static byte[] hexStr2Bytes(String strIn) {
  byte[] arrB = strIn.getBytes();
  int iLen = arrB.length;

  // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
  byte[] arrOut = new byte[iLen / 2];
  for (int i = 0; i < iLen; i = i + 2) {
   String strTmp = new String(arrB, i, 2);
   arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
  }
  return arrOut;
 }

}

以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java加密解密
, Java加密解密工具
, Java加密工具
Java解密工具
javaee和javase的区别、javase javaee、javaee与javase的区别、javase与javaee区别、javaee和javase区别,以便于您获取更多的相关知识。

时间: 2024-11-01 13:50:26

Java加密解密工具(适用于JavaSE/JavaEE/Android)_java的相关文章

JAVA加密解密:自定义类加载器应用

最近在研究JAVA CLASS LOADING技术,已实现了一个自定义的加载器.对目前自定义加载器的应用,还在探讨中.下面是自定义的CLASSLOADER在JAVA加密解密方面的一些研究. JAVA安全 JAVA是解释执行的语言,对于不同的操作平台都有相应的JVM对字节码文件进行解释执行.而这个字节码文件,也就是我们平时所看到的每一个.class文件. 这是我们大家都知道的常识,也就是由.java文件,经过编译器编译,变成JVM所能解释的.class文件. 而这个过程,在现在公开的网络技术中,利

Java加密解密

JAVA是解释执行的语言,对于不同的操作平台都有相应的JVM对字节码文件进行解释执行.而这个字节码文件,也就是我们平时所看到的每一个.class文件.这是我们大家都知道的常识,也就是由.java文件,经过编译器编译,变成JVM所能解释的.class文件.而这个过程,在现在公开的网络技术中,利用一个反编译器,任何人都可以很容易的获取它的源文件.这对于很多人来说是不希望看到的.对于加密解密技术,我懂的不多,有些可以利用某种技术"模糊"JAVA类文件.这样能够使反编译的难度增加.但估计反编译

强大的加密解密工具gpg (GnuPG)

gpg (GnuPG) 1.4.2Copyright (C) 2005 Free Software Foundation, Inc.This program comes with ABSOLUTELY NO WARRANTY.This is free software, and you are welcome to redistribute itunder certain conditions. See the file COPYING for details.Home: C:/Document

JAVA加密解密之对称加密

写的一个JAVA对称加密的工具类,支持DES.DESede.AES.Blowfish.RC2.RC4的加密解密. DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来. DESede是由DES对称加密算法改进后的一种对称加密算法.使用 168 位的密钥对资料进行三次加密的一种机制:它通常(但非始终)提供极其强大的安全性.如果三个 56 位的子元素都

JAVA加密解密之常用签名算法

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992). MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译

JAVA加密解密之RSA算法

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只

JAVA加密解密之Base64

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此

ionCube 一款类似zend的PHP加密/解密工具_php技巧

PHP本身没有带有ionCube loader模块, 必须到ionCube网站下载.ionCube loader是免费的,但是Encoder的价格就比较昂贵(起价$199). 下面要介绍如何在Linux下安装ionCube Loader. 1. 下载ionCube http://www.ioncube.com/loader_download.php, 通过这个链接可以找到对应的版本,我使用wget从命令行获取Linux64版本. wget -c http://downloads2.ioncube

ArcFour加密解密,java RC4加密解密,java 加密解密

 package com.app.common.util; public class ArcFour { /** * 加密解密 参数为String 字符串(String data, String key) * * @param data * @param key * @return String * @throws UnsupportedEncodingException */ public static final int vactorLen = 256; private static S