`

java对称加密字符串示例

阅读更多
/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn 电邮:wallimn@sohu.com 时间:2009-08-11
博客:http://wallimn.iteye.com
网络硬盘:http://wallimn.ys168.com
/***********文章发表请与本人联系,作者保留所有权利*************/
  将字符串使用对称加密的方式加一下密,并转化成可显示字符;将加密结果还原为原来的字符串,是可能在很多场合会用到。
  下面是一个完成上述功能的工具类,觉得有用可以拿去用。
package com.wallimn.gyz.util;

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

/**
 * 这个类用来给一个较短的字符串加、解密<br/>
 * 编码:wallimn 时间:2009-8-12 上午07:43:29<br/>
 * 版本:V1.0<br/>
 */
public class KeyUtil {

	private static final String EncodeAlgorithm = "DES";
	private static KeyUtil instance = null;

	public static KeyUtil getInstance() {
		if (instance == null) {
			instance = new KeyUtil();
			if (!instance.init()) {
				instance = null;
			}
		}
		return instance;
	}

	private SecretKey key = null;

	private boolean init() {
		try {
			KeyGenerator keygen = KeyGenerator.getInstance(EncodeAlgorithm);
			SecureRandom random = new SecureRandom();
			keygen.init(random);
			key = keygen.generateKey();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return key != null;
	}

	private Cipher getCipher(int mode) {
		try {
			Cipher cipher = Cipher.getInstance(EncodeAlgorithm);
			cipher.init(mode, key);
			return cipher;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public Cipher getEncodeCipher() {
		return this.getCipher(Cipher.ENCRYPT_MODE);
	}

	public Cipher getDecodeCipher() {
		return this.getCipher(Cipher.DECRYPT_MODE);
	}

	/**
	 * 解密,若输入为null或加/解密过程出现异常,则输出为null <br/>
	 * 作者:wallimn 时间:2009-8-12 上午08:09:44<br/>
	 * 博客:http://wallimn.iteye.com<br/>
	 * 参数:<br/>
	 * 
	 * @param str
	 * @return
	 */
	public String decode(String str) {
		if(str==null)return null;
		Cipher cipher = getDecodeCipher();
		StringBuffer sb = new StringBuffer();
		int blockSize = cipher.getBlockSize();
		int outputSize = cipher.getOutputSize(blockSize);
		byte[] src = stringToBytes(str);
		byte[] outBytes = new byte[outputSize];
		int i = 0;
		try {
			for (; i <= src.length - blockSize; i = i + blockSize) {
				int outLength = cipher.update(src, i, blockSize, outBytes);
				sb.append(new String(outBytes, 0,outLength));
			}
			if (i == src.length)
				outBytes = cipher.doFinal();
			else {
				outBytes = cipher.doFinal(src, i, src.length - i);
			}
			sb.append(new String(outBytes));
			return sb.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 加密,若输入为null或加/解密过程出现异常,则输出为null <br/>
	 * 作者:wallimn 时间:2009-8-12 上午08:09:59<br/>
	 * 博客:http://wallimn.iteye.com<br/>
	 * 参数:<br/>
	 * 
	 * @param str
	 * @return
	 */
	public String encode(String str) {
		if(str==null)return null;
		Cipher cipher = getEncodeCipher();
		StringBuffer sb = new StringBuffer();
		int blockSize = cipher.getBlockSize();
		int outputSize = cipher.getOutputSize(blockSize);
		byte[] src = str.getBytes();
		byte[] outBytes = new byte[outputSize];
		int i = 0;
		try {
			for (; i <= src.length - blockSize; i = i + blockSize) {
				int outLength = cipher.update(src, i, blockSize, outBytes);
				sb.append(bytesToString(outBytes, outLength));
			}
			if (i == src.length)
				outBytes = cipher.doFinal();
			else {
				outBytes = cipher.doFinal(src, i, src.length - i);
			}
			sb.append(bytesToString(outBytes));
			return sb.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private String bytesToString(byte[] bs) {
		if (bs == null || bs.length == 0)
			return "";
		return bytesToString(bs, bs.length);
	}

	private String bytesToString(byte[] bs, int len) {
		if (bs == null || bs.length == 0)
			return "";
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < len; i++) {
			// System.out.println(bs[i]+":"+String.format("%02X", bs[i]));
			sb.append(String.format("%02X", bs[i]));
		}
		return sb.toString();
	}

	private byte[] stringToBytes(String str) {
		if (str == null || str.length() < 2 || str.length() % 2 != 0)
			return new byte[0];
		int len = str.length();
		byte[] bs = new byte[len / 2];
		for (int i = 0; i * 2 < len; i++) {
			bs[i] = (byte) (Integer.parseInt(str.substring(i * 2, i * 2 + 2),
					16) & 0xFF);
			// System.out.println(str.substring(i * 2, i * 2 + 2)+":"+bs[i]);
		}
		return bs;
	}
}

使用示例:
	public void testCrypt(){
		String str = "wallimn@sohu.com,http://wallimn.iteye.com";
		String tmp = KeyUtil.getInstance().encode(str);
		System.out.println("加密结果:"+ tmp);
		System.out.println("解密结果:"+KeyUtil.getInstance().decode(tmp ));
	}
1
0
分享到:
评论

相关推荐

    AES加密文件和加密字符串示例.zip

    AES,全称Advanced Encryption Standard,即高级加密标准,是一种广泛使用的对称加密算法,用于保护数据的安全性。在本示例中,我们看到的是一系列与AES加密相关的源代码文件和一个明文文本文件。 首先,`aes.c`和`...

    java字符串-用户名和密码-加密解密

    - **硬编码解密测试**:对硬编码的加密字符串进行解密测试。 #### 3.2 byte数组与十六进制字符串转换 ```java public static String byteArr2HexStr(byte[] arrB) throws Exception { int iLen = arrB.length; ...

    java 字符串的加密

    下面我们将深入探讨Java中字符串加密的常用方法、原理以及相关示例。 1. **基础概念** - **明文(Plaintext)**: 需要加密的数据,可以被任何人阅读。 - **密文(Ciphertext)**: 加密后的数据,看起来是无意义的...

    判断字符串是否中心对称

    在编程领域,中心对称是一种特殊的字符串特性,指的是一个字符串从中心点开始向两边读取,字符顺序完全相同。例如,"abcba" 和 "madam" 都是中心对称的,因为它们分别从中心点'c'和'a'向外读取,都能得到相同的字符...

    RSA加密字符串 C++ Builder 6.0

    在C++ Builder 6.0中实现RSA加密字符串,主要涉及以下几个关键知识点: 1. **RSA原理**:RSA算法基于两个大素数的乘积难以分解的数学难题。一对公钥和私钥被生成,公钥用于加密,私钥用于解密。任何人都可以使用...

    1C#使用DES算法加密字符串为定长字符串的方法及代码实现[整理].pdf

    ### C#中使用DES算法加密字符串为定长字符串的方法及代码实现 #### 知识点概述 本文档主要介绍了在C#编程语言中使用DES算法进行字符串加密的具体方法,并提供了完整的代码实现示例。文档中所提到的代码通过.NET...

    Java-Js双向Des对称加密Demo

    本示例"Java-Js双向Des对称加密Demo"提供了在Java和JavaScript两个平台间实现DES加密解密的互操作性。下面将详细阐述DES加密解密的核心原理、Java和JavaScript的实现细节以及如何在两者之间进行兼容。 DES是一种块...

    精彩编程与编程技巧-加密字符串算法...

    ### 精彩编程与编程技巧-加密字符串算法 #### 概述 本文将深入探讨一种基于异或(XOR)运算的简单字符串加密技术。该加密方法通过使用密钥来增强安全性,并采用了一些额外的技术手段来增加破解难度。虽然这种方法...

    加密解密字符串的例子

    这个压缩包文件中的"加密解密字符串的例子"很可能是提供了一个关于如何在编程中实现字符串加密和解密的示例。接下来,我们将深入探讨加密解密的基础知识以及可能涉及的技术。 1. 加密解密原理: 加密是将明文(可...

    Rijin对称加密算法加密、解密字符串

    Rijndael对称加密算法,也被称为AES(高级加密标准),是现代密码学中广泛使用的对称加密算法。在C#中,可以利用.NET框架提供的System.Security.Cryptography命名空间下的类来实现Rijndael加密和解密。本文将详细...

    java+3des加密+和字符串转换javalearnsa资料分享

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。在“java+3des加密+和字符串转换...通过实践和理解相关代码示例,你将能够熟练地在Java项目中应用3DES加密和字符串转换功能。

    mfc字符串加解密

    常见的对称加密算法如AES就具备这样的特性。AES加密过程通常包括选择一个密钥、进行预处理、执行多次替换和置换操作等步骤,最后生成密文。解密过程则相反,使用相同的密钥对密文进行反向操作,恢复原始数据。 在VC...

    Java实现的RSA加密解密算法示例

    RSA加密解密算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1978年发明。RSA算法基于大数分解难题的原理,使用公钥加密、私钥解密的方式实现信息的加密和解密。 知识点2:Java中RSA加密...

    前后端RSA非对称加密解密(代码示例).rar

    登录时,用户的密码用明文传输...非对称加密算法常用RSA算法,秘钥使用base64编码成字符串,后端使用jdk8的标准API,前端使用jsencrypt.js进行RSA的对应操作。经过测试,本例中的前后端代码的加密解密计算结果是一致的。

    加密解密字符串

    在IT领域,加密和解密字符串是至关重要的技术,尤其在数据安全、网络通信和存储保护方面。本文将深入探讨C++中加密解密字符串的相关知识点。 首先,我们需要理解加密和解密的基本概念。加密是对数据进行编码的过程...

    java实现非对称加密

    下面是一个简单的 Java 实现非对称加密的示例代码: ```java import javax.crypto.Cipher; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java....

    VB 加密 解密字符串的例子

    ' 加密字符串 Dim plainText As String = "这是需要加密的字符串" Dim plainTextBytes As Byte() = Encoding.UTF8.GetBytes(plainText) Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key...

    Java中对字符串进行加密和解密

    ### Java中对字符串进行加密和解密的知识点详解 #### 1. 引言 在实际的软件开发过程中,为了确保数据的安全性,经常会遇到需要对数据进行加密和解密的情况,例如保护用户密码或保障网络传输数据的安全。虽然密码学...

    Java实现url加密处理的方法示例

    在Java中,可以使用`java.net.URLEncoder.encode()`方法对加密字符串进行编码,解码则使用`java.net.URLDecoder.decode()`。 7. **异常处理**:在实际应用中,应更全面地处理可能抛出的异常,包括捕获并记录异常...

    java使用Hex编码解码实现Aes加密解密功能示例

    在这个示例中,密钥首先是以字符串形式存在,然后通过`Hex.decodeHex()`方法将其从Hex编码转换回原始的字节数组,这是因为AES算法需要字节形式的密钥。如果密钥是经过Hex编码的,那么在使用之前必须进行解码。 接...

Global site tag (gtag.js) - Google Analytics