java密码加密与解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java密码加密与解密相关的知识,希望对你有一定的参考价值。

参考技术A

  以下两个类可以很方便的完成字符串的加密和解密

  加密 CryptHelper encrypt(password)

  解密 CrypHelper decrypt(password)

  代码如下

  CryptUtils java

  [java]

  package gdie lab crypt;

  import java io IOException;

  import javax crypto Cipher;

  import javax crypto KeyGenerator;

  import javax crypto SecretKey;

  import apache xerces internal impl dv util Base ;

  public class CryptUtils

  private static String Algorithm = DES ;

  private static byte[] DEFAULT_KEY=new byte[] ;

  private static String VALUE_ENCODING= UTF ;

  /**

  * 生成密钥

  *

  * @return byte[] 返回生成的密钥

  * @throws exception

  *             扔出异常

  */

  public static byte[] getSecretKey() throws Exception

  KeyGenerator keygen = KeyGenerator getInstance(Algorithm)

  SecretKey deskey = keygen generateKey()

  // if (debug ) System out println ( 生成密钥 +byte hex (deskey getEncoded

  // ()))

  return deskey getEncoded()

  

  /**

  * 将指定的数据根据提供的密钥进行加密

  *

  * @param input

  *            需要加密的数据

  * @param key

  *            密钥

  * @return byte[] 加密后的数据

  * @throws Exception

  */

  public static byte[] encryptData(byte[] input byte[] key) throws Exception

  SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

  // if (debug )

  //

  // System out println ( 加密前的二进串 +byte hex (input ))

  // System out println ( 加密前的字符串 +new String (input ))

  //

  //

  Cipher c = Cipher getInstance(Algorithm)

  c init(Cipher ENCRYPT_MODE deskey)

  byte[] cipherByte = c doFinal(input)

  // if (debug ) System out println ( 加密后的二进串 +byte hex (cipherByte ))

  return cipherByte;

  

  public static byte[] encryptData(byte[] input) throws Exception

  return encryptData(input DEFAULT_KEY)

  

  /**

  * 将给定的已加密的数据通过指定的密钥进行解密

  *

  * @param input

  *            待解密的数据

  * @param key

  *            密钥

  * @return byte[] 解密后的数据

  * @throws Exception

  */

  public static byte[] decryptData(byte[] input byte[] key) throws Exception

  SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

  // if (debug ) System out println ( 解密前的信息 +byte hex (input ))

  Cipher c = Cipher getInstance(Algorithm)

  c init(Cipher DECRYPT_MODE deskey)

  byte[] clearByte = c doFinal(input)

  // if (debug )

  //

  // System out println ( 解密后的二进串 +byte hex (clearByte ))

  // System out println ( 解密后的字符串 +(new String (clearByte )))

  //

  //

  return clearByte;

  

  public static byte[] decryptData(byte[] input) throws Exception

  return decryptData(input DEFAULT_KEY)

  

  /**

  * 字节码转换成 进制字符串

  *

  * @param byte[] b 输入要转换的字节码

  * @return String 返回转换后的 进制字符串

  */

  public static String byte hex(byte[] bytes)

  StringBuilder hs = new StringBuilder()

  for(byte b : bytes)

  hs append(String format( % $ X b))

  return hs toString()

  

  public static byte[] hex byte(String content)

  int l=content length()》 ;

  byte[] result=new byte[l];

  for(int i= ;i<l;i++)

  int j=i《 ;

  String s=content substring(j j+ )

  result[i]=Integer valueOf(s ) byteValue()

  

  return result;

  

  /**

  * 将字节数组转换为base 编码字符串

  * @param buffer

  * @return

  */

  public static String bytesToBase (byte[] buffer)

  //BASE Encoder en=new BASE Encoder()

  return Base encode(buffer)

  //      return encoder encode(buffer)

  

  /**

  * 将base 编码的字符串解码为字节数组

  * @param value

  * @return

  * @throws IOException

  */

  public static byte[] base ToBytes(String value) throws IOException

  //return Base decodeToByteArray(value)

  //      System out println(decoder decodeBuffer(value))

  //      return decoder decodeBuffer(value)

  return Base decode(value)

  

  /**

  * 加密给定的字符串

  * @param value

  * @return 加密后的base 字符串

  */

  public static String encryptString(String value)

  return encryptString(value DEFAULT_KEY)

  

  /**

  * 根据给定的密钥加密字符串

  * @param value 待加密的字符串

  * @param key 以BASE 形式存在的密钥

  * @return 加密后的base 字符串

  * @throws IOException

  */

  public static String encryptString(String value String key) throws IOException

  return encryptString(value base ToBytes(key))

  

  /**

  * 根据给定的密钥加密字符串

  * @param value 待加密的字符串

  * @param key 字节数组形式的密钥

  * @return 加密后的base 字符串

  */

  public static String encryptString(String value byte[] key)

  try

  byte[] data=value getBytes(VALUE_ENCODING)

  data=CryptUtils encryptData(data key)

  return bytesToBase (data)

   catch (Exception e)

  // TODO Auto generated catch block

  e printStackTrace()

  return null;

  

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @return 明文

  */

  public static String decryptString(String value)

  return decryptString(value DEFAULT_KEY)

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @param key base 形式存在的密钥

  * @return 明文

  * @throws IOException

  */

  public static String decryptString(String value String key) throws IOException

  String s=decryptString(value base ToBytes(key))

  return s;

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @param key 字节数据形式存在的密钥

  * @return 明文

  */

  public static String decryptString(String value byte[] key)

  try

  byte[] data=base ToBytes(value)

  data=CryptUtils decryptData(data key)

  return new String(data VALUE_ENCODING)

  catch(Exception e)

  e printStackTrace()

  return null;

  

  

  

  package gdie lab crypt;

  import java io IOException;

  import javax crypto Cipher;

  import javax crypto KeyGenerator;

  import javax crypto SecretKey;

  import apache xerces internal impl dv util Base ;

  public class CryptUtils

  private static String Algorithm = DES ;

  private static byte[] DEFAULT_KEY=new byte[] ;

  private static String VALUE_ENCODING= UTF ;

  /**

  * 生成密钥

  *

  * @return byte[] 返回生成的密钥

  * @throws exception

  *             扔出异常

  */

  public static byte[] getSecretKey() throws Exception

  KeyGenerator keygen = KeyGenerator getInstance(Algorithm)

  SecretKey deskey = keygen generateKey()

  // if (debug ) System out println ( 生成密钥 +byte hex (deskey getEncoded

  // ()))

  return deskey getEncoded()

  

  /**

  * 将指定的数据根据提供的密钥进行加密

  *

  * @param input

  *            需要加密的数据

  * @param key

  *            密钥

  * @return byte[] 加密后的数据

  * @throws Exception

  */

  public static byte[] encryptData(byte[] input byte[] key) throws Exception

  SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

  // if (debug )

  //

  // System out println ( 加密前的二进串 +byte hex (input ))

  // System out println ( 加密前的字符串 +new String (input ))

  //

  //

  Cipher c = Cipher getInstance(Algorithm)

  c init(Cipher ENCRYPT_MODE deskey)

  byte[] cipherByte = c doFinal(input)

  // if (debug ) System out println ( 加密后的二进串 +byte hex (cipherByte ))

  return cipherByte;

  

  public static byte[] encryptData(byte[] input) throws Exception

  return encryptData(input DEFAULT_KEY)

  

  /**

  * 将给定的已加密的数据通过指定的密钥进行解密

  *

  * @param input

  *            待解密的数据

  * @param key

  *            密钥

  * @return byte[] 解密后的数据

  * @throws Exception

  */

  public static byte[] decryptData(byte[] input byte[] key) throws Exception

  SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

  // if (debug ) System out println ( 解密前的信息 +byte hex (input ))

  Cipher c = Cipher getInstance(Algorithm)

  c init(Cipher DECRYPT_MODE deskey)

  byte[] clearByte = c doFinal(input)

  // if (debug )

  //

  // System out println ( 解密后的二进串 +byte hex (clearByte ))

  // System out println ( 解密后的字符串 +(new String (clearByte )))

  //

  //

  return clearByte;

  

  public static byte[] decryptData(byte[] input) throws Exception

  return decryptData(input DEFAULT_KEY)

  

  /**

  * 字节码转换成 进制字符串

  *

  * @param byte[] b 输入要转换的字节码

  * @return String 返回转换后的 进制字符串

  */

  public static String byte hex(byte[] bytes)

  StringBuilder hs = new StringBuilder()

  for(byte b : bytes)

  hs append(String format( % $ X b))

  return hs toString()

  

  public static byte[] hex byte(String content)

  int l=content length()》 ;

  byte[] result=new byte[l];

  for(int i= ;i<l;i++)

  int j=i《 ;

  String s=content substring(j j+ )

  result[i]=Integer valueOf(s ) byteValue()

  

  return result;

  

  /**

  * 将字节数组转换为base 编码字符串

  * @param buffer

  * @return

  */

  public static String bytesToBase (byte[] buffer)

  //BASE Encoder en=new BASE Encoder()

  return Base encode(buffer)

  //  return encoder encode(buffer)

  

  /**

  * 将base 编码的字符串解码为字节数组

  * @param value

  * @return

  * @throws IOException

  */

  public static byte[] base ToBytes(String value) throws IOException

  //return Base decodeToByteArray(value)

  //  System out println(decoder decodeBuffer(value))

  //  return decoder decodeBuffer(value)

  return Base decode(value)

  

  /**

  * 加密给定的字符串

  * @param value

  * @return 加密后的base 字符串

  */

  public static String encryptString(String value)

  return encryptString(value DEFAULT_KEY)

  

  /**

  * 根据给定的密钥加密字符串

  * @param value 待加密的字符串

  * @param key 以BASE 形式存在的密钥

  * @return 加密后的base 字符串

  * @throws IOException

  */

  public static String encryptString(String value String key) throws IOException

  return encryptString(value base ToBytes(key))

  

  /**

  * 根据给定的密钥加密字符串

  * @param value 待加密的字符串

  * @param key 字节数组形式的密钥

  * @return 加密后的base 字符串

  */

  public static String encryptString(String value byte[] key)

  try

  byte[] data=value getBytes(VALUE_ENCODING)

  data=CryptUtils encryptData(data key)

  return bytesToBase (data)

   catch (Exception e)

  // TODO Auto generated catch block

  e printStackTrace()

  return null;

  

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @return 明文

  */

  public static String decryptString(String value)

  return decryptString(value DEFAULT_KEY)

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @param key base 形式存在的密钥

  * @return 明文

  * @throws IOException

  */

  public static String decryptString(String value String key) throws IOException

  String s=decryptString(value base ToBytes(key))

  return s;

  

  /**

  * 解密字符串

  * @param value base 形式存在的密文

  * @param key 字节数据形式存在的密钥

  * @return 明文

  */

  public static String decryptString(String value byte[] key)

  try

  byte[] data=base ToBytes(value)

  data=CryptUtils decryptData(data key)

  return new String(data VALUE_ENCODING)

  catch(Exception e)

  e printStackTrace()

  return null;

  

  

  

  CryptHelper java

  [java]

  package gdie lab crypt;

  import javax crypto Cipher;

  import javax crypto SecretKey;

  import javax crypto SecretKeyFactory;

  import javax crypto spec DESKeySpec;

  import javax crypto spec IvParameterSpec;

  import springframework util DigestUtils;

  public class CryptHelper

  private static String CRYPT_KEY = zhongqian ;

  //加密

  private static Cipher ecip;

  //解密

  private static Cipher dcip;

  static

  try

  String KEY = DigestUtils md DigestAsHex(CRYPT_KEY getBytes()) toUpperCase()

  KEY = KEY substring( )

  byte[] bytes = KEY getBytes()

  DESKeySpec ks = new DESKeySpec(bytes)

  SecretKeyFactory skf = SecretKeyFactory getInstance( DES )

  SecretKey sk = skf generateSecret(ks)

  IvParameterSpec iv = new IvParameterSpec(bytes)

  ecip = Cipher getInstance( DES/CBC/PKCS Padding )

  ecip init(Cipher ENCRYPT_MODE sk iv )

  dcip = Cipher getInstance( DES/CBC/PKCS Padding )

  dcip init(Cipher DECRYPT_MODE sk iv )

  catch(Exception ex)

  ex printStackTrace()

  

  

  public static String encrypt(String content) throws Exception

  byte[] bytes = ecip doFinal(content getBytes( ascii ))

  return CryptUtils byte hex(bytes)

  

  public static String decrypt(String content) throws Exception

  byte[] bytes  = CryptUtils hex byte(content)

  bytes = dcip doFinal(bytes)

  return new String(bytes ascii )

  

  //test

  public static void main(String[] args) throws Exception

  String password = gly ;

  String en = encrypt(password)

  System out println(en)

  System out println(decrypt(en))

  

  

  package gdie lab crypt;

  import javax crypto Cipher;

  import javax crypto SecretKey;

  import javax crypto SecretKeyFactory;

  import javax crypto spec DESKeySpec;

  import javax crypto spec IvParameterSpec;

  import springframework util DigestUtils;

  public class CryptHelper

  private static String CRYPT_KEY = zhongqian ;

  //加密

  private static Cipher ecip;

  //解密

  private static Cipher dcip;

  static

  try

  String KEY = DigestUtils md DigestAsHex(CRYPT_KEY getBytes()) toUpperCase()

  KEY = KEY substring( )

  byte[] bytes = KEY getBytes()

  DESKeySpec ks = new DESKeySpec(bytes)

  SecretKeyFactory skf = SecretKeyFactory getInstance( DES )

  SecretKey sk = skf generateSecret(ks)

  IvParameterSpec iv = new IvParameterSpec(bytes)

  ecip = Cipher getInstance( DES/CBC/PKCS Padding )

  ecip init(Cipher ENCRYPT_MODE sk iv )

  dcip = Cipher getInstance( DES/CBC/PKCS Padding )

  dcip init(Cipher DECRYPT_MODE sk iv )

  catch(Exception ex)

  ex printStackTrace()

  

  

  public static String encrypt(String content) throws Exception

  byte[] bytes = ecip doFinal(content getBytes( ascii ))

  return CryptUtils byte hex(bytes)

  

  public static String decrypt(String content) throws Exception

  byte[] bytes  = CryptUtils hex byte(content)

  bytes = dcip doFinal(bytes)

  return new String(bytes ascii )

  

  //test

  public static void main(String[] args) throws Exception

  String password = gly ;

  String en = encrypt(password)

  System out println(en)

  System out println(decrypt(en))

  

lishixinzhi/Article/program/Java/hx/201311/26449

Java加密与解密之对称加密算法

概述

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

「在对称加密算法中,DES算法最具有代表性,DESede是DES算法的变种,AES算法则作为DES算法的替代者。」

DES

「DES(Data Encryption Standard)」,即「数据加密标准」,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DesUtil {

    /**
     * DES加密
     * @param content 待加密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String desEncrypt(String content, String key) throws Exception {
        //指定加密算法、加密模式、填充模式
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
        //指定加密模式为加密,指定加密规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        //调用加密方法
        byte[] result = cipher.doFinal(content.getBytes());
        //用Base64编码
        return new String(Base64.getEncoder().encode(result));
    }

    /**
     * DES解密
     * @param content 待解密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String desDecrypt(String content, String key) throws Exception {
        //Base64解码
        byte[] result = Base64.getDecoder().decode(content);
        //指定加密算法、加密模式、填充模式
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
        //指定加密模式为解密,指定加密规则
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        return new String(cipher.doFinal(result));
    }

    public static void main(String[] args) throws Exception {
        //key要8位,不然会报错:java.security.InvalidKeyException: Wrong key size
        String key = "12345678";
        //待加密数据
        String content = "对称加密算法";

        //加密
        System.out.println(desEncrypt(content, key));//qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor

        //解密
        System.out.println(desDecrypt("qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor", key));//对称加密算法
    }
}

DESede

「DESede」是由DES改进后的一种对称加密算法,针对其密钥长度偏短和迭代次数偏少等问题做了相应改进,提高了安全强度。


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DesedeUtil {

    /**
     * Desede加密
     * @param content 待加密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String desEncrypt(String content, String key) throws Exception {
        //指定加密算法、加密模式、填充模式
        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DESede");
        //指定加密模式为加密,指定加密规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        //调用加密方法
        byte[] result = cipher.doFinal(content.getBytes());
        //用Base64编码
        return new String(Base64.getEncoder().encode(result));
    }

    /**
     * Desede解密
     * @param content 待解密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String desDecrypt(String content, String key) throws Exception {
        //Base64解码
        byte[] result = Base64.getDecoder().decode(content);
        //指定加密算法、加密模式、填充模式
        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DESede");
        //指定加密模式为解密,指定加密规则
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        return new String(cipher.doFinal(result));
    }

    public static void main(String[] args) throws Exception {
        //key要24位,不然会报错:java.security.InvalidKeyException: Wrong key size
        String key = "123456781234567812345678";
        //待加密数据
        String content = "对称加密算法";

        //加密
        System.out.println(desEncrypt(content, key));//qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor

        //解密
        System.out.println(desDecrypt("qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor", key));//对称加密算法
    }
}

AES

「AES(Advanced Encryption Standard)」,即「高级加密标准」,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesUtil {

    /**
     * aes加密
     * @param content 待加密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String aesEncrypt(String content, String key) throws Exception {
        //指定加密算法
        Cipher cipher = Cipher.getInstance("AES");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
        //指定加密模式为加密,指定加密规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        //调用加密方法
        byte[] result = cipher.doFinal(content.getBytes());
        //用Base64编码
        return new String(Base64.getEncoder().encode(result));
    }

    /**
     * aes解密
     * @param content 待解密数据
     * @param key 密钥
     * @return
     * @throws Exception
     */

    public static String aesDecrypt(String content, String key) throws Exception {
        //Base64解码
        byte[] result = Base64.getDecoder().decode(content);
        //指定加密算法
        Cipher cipher = Cipher.getInstance("AES");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
        //指定加密模式为解密,指定加密规则
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        return new String(cipher.doFinal(result));
    }

    public static void main(String[] args) throws Exception {
        //key要16/24/32位,不然会报错:java.security.InvalidKeyException: Wrong key size
        String key = "12345678123456781234567812345678";
        String content = "对称加密算法";

        //加密
        System.out.println(aesEncrypt(content, key));//yrdeR6atwBX0yeXzudk/al6q8K61gyPylX7GfwsKP9w=

        //解密
        System.out.println(aesDecrypt("yrdeR6atwBX0yeXzudk/al6q8K61gyPylX7GfwsKP9w=", key));
    }
}

参考:Java加密与解密的艺术


以上是关于java密码加密与解密的主要内容,如果未能解决你的问题,请参考以下文章

AES加密和解密Java

java加密用PHP解密

Java加密,解密中的bc,cc是什么意思

Java加密与解密之对称加密算法

php与java通用AES加密解密算法

MySQL密码加密与解密