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密码加密与解密的主要内容,如果未能解决你的问题,请参考以下文章