java字符串加密解密

try {

String test = "[email protected]";

EncryptionDecryption des = new EncryptionDecryption("tourhb");// 自定义密钥

System.out.println("加密前的字符:" + test);

System.out.println("加密后的字符:" + des.encrypt(test));

System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));

System.out.println("解密后的字符:"

+ des.decrypt("fe14c7c41f7d2a94b07d7928b21346e7"));

} catch (Exception e) {

e.printStackTrace();

}

下面是加密解密类的源码

import java.security.Key;

import java.security.Security;

import javax.crypto.Cipher;

public class EncryptionDecryption {

private static String strDefaultKey = "tourhb";

/** 加密工具 */

private Cipher encryptCipher = null;

/** 解密工具 */

private Cipher decryptCipher = null;

/**

* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]

* hexStr2ByteArr(String strIn) 互为可逆的转换过程

*

* @param arrB

*            需要转换的byte数组

* @return 转换后的字符串

* @throws Exception

*

*/

public static String byteArr2HexStr(byte[] arrB) throws Exception {

int iLen = arrB.length;

// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍

StringBuffer sb = new StringBuffer(iLen * 2);

for (int i = 0; i < iLen; i++) {

int intTmp = arrB[i];

// 把负数转换为正数

while (intTmp < 0) {

intTmp = intTmp + 256;

}

// 小于0F的数需要在前面补0

if (intTmp < 16) {

sb.append("0");

}

sb.append(Integer.toString(intTmp, 16));

}

return sb.toString();

}

/**

* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)

* 互为可逆的转换过程

*

* @param strIn 需要转换的字符串

* @return 转换后的byte数组

* @throws Exception

*

*/

public static byte[] hexStr2ByteArr(String strIn) throws Exception {

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;

}

/**

* 默认构造方法,使用默认密钥

*

* @throws Exception

*/

public EncryptionDecryption() throws Exception {

this(strDefaultKey);

}

/**

* 指定密钥构造方法

*

* @param strKey

*            指定的密钥

* @throws Exception

*/

public EncryptionDecryption(String strKey) throws Exception {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

Key key = getKey(strKey.getBytes());

encryptCipher = Cipher.getInstance("DES");

encryptCipher.init(Cipher.ENCRYPT_MODE, key);

decryptCipher = Cipher.getInstance("DES");

decryptCipher.init(Cipher.DECRYPT_MODE, key);

}

/**

* 加密字节数组

*

* @param arrB

*            需加密的字节数组

* @return 加密后的字节数组

* @throws Exception

*/

public byte[] encrypt(byte[] arrB) throws Exception {

return encryptCipher.doFinal(arrB);

}

/**

* 加密字符串

*

* @param strIn

*            需加密的字符串

* @return 加密后的字符串

* @throws Exception

*/

public String encrypt(String strIn) throws Exception {

return byteArr2HexStr(encrypt(strIn.getBytes()));

}

/**

* 解密字节数组

*

* @param arrB

*            需解密的字节数组

* @return 解密后的字节数组

* @throws Exception

*/

public byte[] decrypt(byte[] arrB) throws Exception {

return decryptCipher.doFinal(arrB);

}

/**

* 解密字符串

*

* @param strIn

*            需解密的字符串

* @return 解密后的字符串

* @throws Exception

*/

public String decrypt(String strIn) throws Exception {

try {

return new String(decrypt(hexStr2ByteArr(strIn)));

} catch (Exception e) {

return "";

}

}

/**

* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位

*

* @param arrBTmp

*            构成该字符串的字节数组

* @return 生成的密钥

* @throws java.lang.Exception

*/

private Key getKey(byte[] arrBTmp) throws Exception {

// 创建一个空的8位字节数组(默认值为0)

byte[] arrB = new byte[8];

// 将原始字节数组转换为8位

for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {

arrB[i] = arrBTmp[i];

}

// 生成密钥

Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

return key;

}

}

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-12-28 12:10:20

java字符串加密解密的相关文章

java字符串加密与解密

原文:java字符串加密与解密 源代码下载地址:http://www.zuidaima.com/share/1557602896464896.htm 这段时间正好系统中有需要对密码进行加密,还要能进行解密,支持自定义密钥.现分享给大家,希望能帮助到牛牛们. 有些人可能会遇到com.sun.crypto.provider.SunJCE报错,是由于编译器(jdk1.7以下)对必须得库有一定的限制,因此无法构造改函数,解决方法是设置一下编译器的报错级别,具体的解决方法可以参照这篇文章: http://

C# Java DES加密解密

c#代码: public class DESHelper    {          /// <summary>        /// DES加密算法        /// </summary>        /// <param name="encryptString">要加密的字符串</param>        /// <param name="sKey">加密码Key</param>  

C# 实现 JAVA AES加密解密[原创]

以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收JAVA发送的AES加密字符串后,在.NET没有对应的KeyGenerator 和 SecureRandom去生成AES 的 KEY值,导致无法直接解密. 1 import java.security.SecureRandom; 2 import java.util.Base64; 3 4 impor

PHP对字符串加密解密的函数

加密解密在一个系统中的应用是非常常见的需求,PHP做的网站中,也会经常用到一些加密解密的时候.下面介绍一个比较好用的加密解密函数,收藏下,以后会用得到. <?php  $id = 132; $token = encrypt($id, 'E', 'nowamagic'); echo '加密:'.encrypt($id, 'E', 'nowamagic'); echo '<br />'; echo '解密:'.encrypt($token, 'D', 'nowamagic'); /*****

java 文件加密解密

1 package com.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.security.KeyPair; 9 import java.security.KeyPairGenerator; 10

C#&nbsp;字符串加密解密函数

原文:C# 字符串加密解密函数 using System; using System.Text;using System.Security.Cryptography; using System.IO; //默认密钥向量private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// <summary> /// DES加密字符串 /// </summary> /// <par

C# Java 3DES加密解密 扩展及修正\0 问题

注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ----------------------------------------------------------- /// 说明: /// 转载自网上http://bbs.csdn.net/topics/350158619 /// 并加以扩展 /// 修正: /// 1. 修改正解密后出现 '\0' /// 注: 1. 向量不能小于8位 /// 2. 明文末尾如果是带'\0'字

java AES加密解密

近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据.本文就简单介绍如何通过JAVA实现AES加密. 因为在做接口 webservice的时候接受穿过的数据 是xml 加密为二进制 byte[]   下面直接看代码 : import java.io.UnsupportedEncodingException; import java.

密码学——Java BASE64加密解密

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