`

AES加解密实例

阅读更多

AES加解密实例

package com.bijian.study;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
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;

import org.apache.axis.encoding.Base64;

public class AESTools {

	private static String password = "好复杂的密码complex password,没见过这么奇怪的密码";

	/**
	 * 获取密码
	 */
	public static String getPassword() {
		return password;
	}

	/**
	 * 加密
	 * @param content
	 * @param password
	 * @return
	 */
	public static byte[] encrypt(String content, String password) {
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
			random.setSeed(getKeyByStr(password));
			kgen.init(128, random);
			SecretKey secretKey = kgen.generateKey();
			byte[] enCodeFormat = secretKey.getEncoded();
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
			Cipher cipher = Cipher.getInstance("AES");// 创建密码器
			byte[] byteContent = content.getBytes("UTF-8");
			cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
			byte[] result = cipher.doFinal(byteContent);
			return result; // 加密
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 解密
	 * @param content
	 * @param password
	 * @return
	 */
	public static byte[] decrypt(byte[] content, String password) {
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
			random.setSeed(getKeyByStr(password));
			kgen.init(128, random);
			SecretKey secretKey = kgen.generateKey();
			byte[] enCodeFormat = secretKey.getEncoded();
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
			Cipher cipher = Cipher.getInstance("AES");// 创建密码器
			cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
			byte[] result = cipher.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;
	}

	public static byte[] getKeyByStr(String str) {
		byte[] bRet = new byte[str.length() / 2];
		for (int i = 0; i < str.length() / 2; i++) {
			Integer itg = new Integer(16 * getChrInt(str.charAt(2 * i)) + getChrInt(str.charAt(2 * i + 1)));
			bRet[i] = itg.byteValue();
		}
		return bRet;
	}

	public static int getChrInt(char chr) {

		int iRet = 0;
		if (chr == "0".charAt(0))
			iRet = 0;
		if (chr == "1".charAt(0))
			iRet = 1;
		if (chr == "2".charAt(0))
			iRet = 2;
		if (chr == "3".charAt(0))
			iRet = 3;
		if (chr == "4".charAt(0))
			iRet = 4;
		if (chr == "5".charAt(0))
			iRet = 5;
		if (chr == "6".charAt(0))
			iRet = 6;
		if (chr == "7".charAt(0))
			iRet = 7;
		if (chr == "8".charAt(0))
			iRet = 8;
		if (chr == "9".charAt(0))
			iRet = 9;
		if (chr == "A".charAt(0))
			iRet = 10;
		if (chr == "B".charAt(0))
			iRet = 11;
		if (chr == "C".charAt(0))
			iRet = 12;
		if (chr == "D".charAt(0))
			iRet = 13;
		if (chr == "E".charAt(0))
			iRet = 14;
		if (chr == "F".charAt(0))
			iRet = 15;
		return iRet;
	}

	public static String decryptString(String contents) {
		return new String(decrypt(Base64.decode(contents), password));
	}

	public static String encryptString(String contents) {
		return Base64.encode(encrypt(contents, password));
	}

	public static void main(String[] args) {

		String text = "深圳欢迎您!Welcome to shenzhen!";
		
		//加密
		String encryptStr = AESTools.encryptString(text);
		System.out.println("text length:" + text.length() + ",text:" + text);
		
		System.out.println("encryptStr length:" + encryptStr.length() + ",encryptStr" + encryptStr);
		
		System.out.println("密文比明文增加长度add length:"	+ (encryptStr.length() - text.length()));
		
		//解密
		String decryptStr = AESTools.decryptString(encryptStr);
		System.out.println("decryptStr length:" + decryptStr.length() + ",decryptStr:" + decryptStr);
	}
}

运行结果:

text length:26,text:深圳欢迎您!Welcome to shenzhen!
encryptStr length:64,encryptStrujOEp9losb7mJx8a8Ht2nbCNaVtfCrAuKt9JRjTGdULpPYJOUr0nvzYQ9rvqWB6z
密文比明文增加长度add length:38
decryptStr length:26,decryptStr:深圳欢迎您!Welcome to shenzhen!
分享到:
评论

相关推荐

    VB.NET实现AES加密解密

    VB.NET实现AES加密解密代码,可直接使用

    python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原先的输入,运行的结果...

    C#写的大文件AES加密解密程序

    1. **AES类的实例化**:首先,需要创建一个AES加密器实例,设置密钥和初始化向量(IV)。密钥和IV是AES加密的重要参数,它们的长度根据所选的AES模式(如CBC、ECB等)有所不同,通常密钥应保持为128、192或256位。 ...

    AES加解密前后端实例

    在实际应用中,AES加解密通常配合其他安全措施,如HMAC(Hash-based Message Authentication Code)用于验证数据完整性,或者使用非对称加密(如RSA)来安全地交换AES密钥。 总结来说,AES加解密是保障数据安全的...

    android使用AES加密和解密文件实例代码

    Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密和解密文件是一种常见的安全措施。本文将详细介绍 Android 使用 AES 加密和解密文件的实例代码,并...

    nodejs aes 加解密实例

    本篇将详细解析给出的Node.js AES加解密实例,帮助你理解如何在实际项目中实现AES加密和解密。 首先,我们需要引入Node.js内置的`crypto`模块,它是处理加密和哈希算法的核心库。 ```javascript const crypto = ...

    PB下的加密解密的简单算法函数

    PB下的加密解密的简单算法 原理上对原字符串的每个字符做了数值转换,在加上加密因子,经过颠倒错位后再形成加密后数值,解密时再颠倒转换回来。 比较简单,现在用于对安全性要求不高的应用里。 原来发了一份,资源...

    C# AES加密解密小工具

    项目中的AES加解密.sln文件是Visual Studio的解决方案文件,包含了项目的配置信息和依赖关系。打开此文件,可以使用Visual Studio来编译和运行项目。另一个未列出完全名称的文件可能是源代码文件,可能包含了实现...

    AES加密解密详细演示AES加密解密过程

    **AES-128实例** - 明文区段:128位,Nb = 4。 - 密钥长度:128位,Nk = 4。 - 重复次数:Nr = 6 + max(Nb, Nr) = 10。 **AES加密过程** AES加密过程包含以下四个主要步骤: 1. **回合密钥加法(AddRoundKey)**...

    c# aes 加解密

    在C#中,我们可以利用.NET框架提供的System.Security.Cryptography命名空间中的类来实现AES加解密。本篇将详细介绍C#中如何使用AES进行数据的加密与解密。 首先,AES的核心概念包括密钥、初始化向量(IV)和块大小...

    pb + openssl 实现 RSA、SM2、AES

    pb11.5 + pbni + openssl实现RSA\SM2\AES加密解密,平时用不到这些,做民营医疗机构监管平台对接,AK/SK接口认证,需要用到RSA\AES才做,分享出来,希望能对有需要的人有点帮助。

    java,php,python AES 加解密互通

    描述中提到,我们需要确保在不同语言环境下进行AES加解密时,加密模式(Mode)和填充方式(Padding)保持一致,这是确保数据在这些语言之间能正确解密的关键。常见的AES模式有ECB(Electronic Codebook)、CBC...

    Delphi版AES加密解密模块源码,支持128位、192位、256位密钥

    通常,AES加密包括多个相同步骤的轮,每轮都包括字节替换、行移位、列混淆和轮密钥加等操作。 `Delphi_Lazarus版AES加密解密使用说明.txt` 文件则提供了如何在Delphi或Lazarus项目中集成和使用这个AES模块的指导。...

    crypto-js.zip,AES加密解密egret库有.d.ts文件

    2. **编写代码**:利用.d.ts文件提供的类型定义,创建AES加密和解密的实例,设置密钥,并调用相应的加密或解密方法。 3. **数据处理**:在游戏逻辑中,可以将需要加密的数据传递给加密函数,得到加密后的密文存储或...

    AES加解密系统(C++)

    **AES加解密系统(C++)** AES,全称为Advanced Encryption Standard,即高级加密标准,是目前广泛应用的块密码算法。它在2001年被美国国家标准与技术研究所(NIST)采纳为联邦信息处理标准(FIPS),取代了DES...

    MFC实现的AES加密解密程序

    同时,该程序可以作为学习AES加密和MFC编程的一个实例,开发者可以根据需求进行二次开发,例如增加密码保护、多线程处理等功能。 总之,这个"MFC实现的AES加密解密程序"结合了强大的加密算法和易用的用户界面,为...

    C#实现十六进制AES的加解密,字节数组工具类

    在C#中,可以利用.NET框架提供的System.Security.Cryptography命名空间中的类来实现AES加解密。具体来说,我们将关注两个核心文件:`ByteUtil.cs`和`AesHelper.cs`。 `ByteUtil.cs`通常包含一系列与字节数组操作...

    aes加密解密

    这套资源涵盖了AES加密解密在Java和JavaScript两端的应用,使得数据在客户端与服务器之间的传输更加安全。 在Java中,AES加密通常涉及以下步骤: 1. **密钥生成**:首先需要一个密钥,可以使用`javax.crypto....

    AES加解密模块|推荐代码

    在VB(Visual Basic)网络编程中,AES加解密模块扮演着重要的角色,尤其对于数据的安全传输和存储至关重要。Winsock控件是VB中用于实现网络通信的基础工具,它允许开发者创建简单的聊天程序或进行局域网的网络编程。...

Global site tag (gtag.js) - Google Analytics