`
caniggia1986
  • 浏览: 151718 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

序列化与反序列化中的AES加密

    博客分类:
  • java
阅读更多

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.AlgorithmParameters;
import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.Date;

import javax.crypto.Cipher;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import com.yoursite.bean.UserInfo;

public class SerializationUtil {
	static String algorithm = "AES"; 
	static Cipher encrypter = null, decrypter = null;
	static { 
		setupCrypt();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		UserInfo customer = new UserInfo("河蟹", "xxx@gmail", new Date(0));
		File file = new File("D:\\instance.obj");
		serialization(file,customer);
		customer = (UserInfo)deserialization(file);
		System.out.println(customer);
	}

	// 反序列化对象
	public static Object deserialization(File file) throws Exception {

		ObjectInputStream in = null;
		SealedObject sealed = null;
		Object object = null;
		try {
			in = new ObjectInputStream(new FileInputStream(file));
			sealed = (SealedObject) in.readObject();
			object = sealed.getObject(decrypter); 
		} catch (Exception e) {
			throw e;
		} finally {
			if (in != null)
				in.close();
		}
		return object;
	}

	// 序列化对象
	@SuppressWarnings("unused")
	public static void serialization(File file,Object object) throws Exception {
		ObjectOutputStream out = null;
		SealedObject sealed = null;
		try {
			out = new ObjectOutputStream(new FileOutputStream(file)); 
			sealed = new SealedObject((Serializable) object, encrypter);
			out.writeObject(sealed);
		} catch (Exception e) {
			throw e;
		} finally {
			if (out != null)
				out.close();
		}
	}

	private static byte[] getMD5(String input) {
		try {
			byte[] bytesOfMessage = input.getBytes("UTF-8");
			MessageDigest md = MessageDigest.getInstance("MD5");
			return md.digest(bytesOfMessage);
		} catch (Exception e) {
			return null;
		}
	} 
	@SuppressWarnings("unused")
	private static void setupCrypt() {
		String key ="helloworld";
		SecretKeySpec skey = new SecretKeySpec(getMD5(key), algorithm);
		// Create an 8-byte initialization vector
		byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
				0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };

		AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
		try {
			encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
			decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
			// CBC requires an initialization vector
			encrypter.init(Cipher.ENCRYPT_MODE, skey, paramSpec);
			decrypter.init(Cipher.DECRYPT_MODE, skey, paramSpec);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unused")
	private static void setupCrypt2() { 
		//key需要128
		String key = "81865011520190145659841015258206940634698416000116687963543955828649380740817034326700266554532335762191268533799481074944660845";
		char[] password = key.toCharArray();
		byte[] salt = "123456".getBytes();
		SecretKeyFactory factory = null;
		SecretKey tmp = null;
		KeySpec spec = new PBEKeySpec(password, salt, 1024, 128);
		try {
			factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
			tmp = factory.generateSecret(spec);
		} catch (Exception e) {
			e.printStackTrace();
		}
		SecretKey secret = new SecretKeySpec(tmp.getEncoded(), algorithm);
		try {
			encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
			encrypter.init(Cipher.ENCRYPT_MODE, secret);
			AlgorithmParameters params = encrypter.getParameters();
			byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
			decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");
			decrypter.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
@SuppressWarnings("unused")
	private static void setupCrypt3() { 
		//16位
		String key = "0123456789123456";
 		SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), algorithm);
 		try {
 			encrypter = Cipher.getInstance(algorithm);
 	 		encrypter.init(Cipher.ENCRYPT_MODE, skeySpec);
 	 		decrypter = Cipher.getInstance(algorithm);
 	 		decrypter.init(Cipher.DECRYPT_MODE, skeySpec);
 		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

一些有用链接
http://stackoverflow.com/questions/992019/java-256bit-aes-encryption/992413#992413
http://www.ibm.com/developerworks/cn/java/j-5things1/?ca=drs-cn-0504


分享到:
评论

相关推荐

    序列化和反序列化(文本加密成二进制文件)

    在IT领域,序列化和反序列化是两个关键概念,主要...总结来说,序列化和反序列化是编程中处理数据的重要手段,结合加密技术可以有效保护数据的安全。`ExtendDemo`可能就是一个很好的学习资源,帮助开发者掌握这些技能。

    asp.net购物车类的反序列化

    5. **加密与解密**:为了增强安全性,序列化后的数据可能会通过加密算法(如AES)进行加密,然后在反序列化前解密。加密过程需要妥善管理密钥,以确保只有授权方能解密数据。 6. **Session存储**:在ASP.NET中,...

    序列化反序列用户名与密码

    在IT行业中,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和对象持久化等场景中。在C#编程语言中,这些技术被广泛使用,尤其是在处理用户登录信息时,如用户名和密码的安全存储和传输。本文将详细...

    c/c++与java互通 AES加密解密

    在跨平台通信中,数据的序列化和反序列化是关键。由于C/C++和Java的数据表示方式可能存在差异,我们需要确保加密后的字节序列在两者的环境中都能正确解析。例如,C/C++中的字节序可能是大端或小端,而Java默认使用...

    C语言实现的AES加密解密

    在C语言中实现AES加密解密,需要理解AES的工作原理和C语言编程的基本概念。 AES的核心是基于替换和置换的组合,通过一系列复杂的数学操作(如字节代换、行位移、列混淆和轮密钥加)对明文进行加密,然后通过相反的...

    Shiro反序列化流量分析.pdf

    【AES加密与解密】 AES(Advanced Encryption Standard)是一种常用的对称加密算法。在Shiro的反序列化漏洞中,AES用于加密RememberMe令牌。其主要参数包括: - mode:加密模式,如CBC(Cipher Block Chaining)模式...

    c AES, c++ AES, java AES, 互通, 加密解密

    2. 密钥和IV的序列化:将它们转换为字节数组并保存,确保字节顺序一致。 3. 加密:在C/C++和Java中实现AES加密算法,处理输入的明文数据。 4. 解密:在另一端实现AES解密算法,还原加密后的数据。 5. 检验:解密后,...

    Linux上运行的C语言的AES加密算法

    在AES加密后的密文是二进制格式,不便于直接显示或传输,通过Base64编码,可以将密文转换为可读的字符序列,方便处理。 为了在Linux上实现这个功能,开发者需要理解以下几个关键点: - **C库的使用**:Linux上常见...

    AES加密算法(C++实现,附源码)

    在C++环境中实现AES加密算法,通常涉及到的关键概念包括密钥、明文、密文、加密过程和解密过程。源码中可能包含的文件如AES.cpp和AES.h,分别对应实现类或函数的主体部分和头文件定义。 AES算法基于一个固定大小的...

    小程序AES加密

    在微信小程序中,AES加密常用于服务器与客户端之间的通信,以确保数据在传输过程中的安全性。 首先,要实现微信小程序的AES加密,你需要在项目中引入相关的加密库。在这个压缩包中,提供了一个名为`utils`的文件夹...

    128-AES-CTR_AES加密解密_

    - 加密循环:对每个128位的数据块执行AES加密,并与计数器的加密结果异或。 - 解密过程:因为CTR模式是可逆的,解密只需重复加密过程。 源代码的具体实现细节会涉及C++编程语言,包括如何使用库函数(如OpenSSL的...

    android使用AES加密对文件进行前中后三段2M长度加密

    - 将加密后的块、密钥和IV序列化,以便于存储和传输。 - 解密时,按照相反的顺序操作。 7. **安全存储**:加密后的数据和相关元数据(如密钥和IV)应安全地存储,可以使用SQLite数据库或其他安全的存储方式。 8....

    AESEncryption,如何在android和ios中实现aes加密的演示.zip

    在这个开源项目中,我们将探讨如何在Android和iOS平台上实现AES加密。以下是对这个项目的详细讲解。 1. **AES加密原理**: AES是基于块密码,每个加密块大小为128位。它使用128、192或256位的密钥来加密128位的...

    AES加密算法接口及演示程序最新版下载

    在"vc AES加密算法接口及演示程序最新版下载"中,"vc"通常指的是Visual C++,这意味着提供的资源可能是一个用C++编写的AES加密库或示例程序。这个资源可能包含了AES加密的API接口,允许开发者在C++项目中方便地集成...

    AES 加密解密示例

    使用这个组件,开发者可以轻松地集成AES加密到他们的应用程序中,以保护敏感数据。 总之,这个示例通过DELPHI展示了AES加密解密的基本操作,包括文件和内容的处理。通过理解和使用这些代码,开发者可以提升他们应用...

    AES加密算法源代码

    根据给定的文件信息,我们可以总结出以下关于AES加密算法的知识点: ### 一、AES加密算法概述 AES(Advanced Encryption Standard),即高级加密标准,是一种对称加密算法,用于数据的安全传输。它是由比利时密码...

    QT5安全笔记本AES加密

    在这款应用中,Json可能被用作数据存储格式,用于序列化和反序列化用户的笔记内容和元数据,以便于在内存中操作和持久化到磁盘。 5. **Clion+cmake**:Clion是JetBrains公司开发的一款C++集成开发环境,提供了强大...

    C++语言下支撑中文无限长度AES加解密算法实现

    本篇文章将详细讲解如何在C++环境下实现一个支持中文字符和无限长度明文的AES加密与解密系统,以及涉及的相关技术点。 AES,全称为高级加密标准,是一种广泛使用的对称加密算法,它基于块密码,通常以128位(16字节...

    09-一次Shiro反序列化引起的域控沦陷.pdf

    4. 漏洞影响范围:只要Remember Me的AES加密密钥被泄露,无论Shiro的版本如何,都可能触发反序列化漏洞。 5. 检测Shiro使用:通过检查登录响应包是否存在Remember Me标记,或者修改登录请求的Cookie,若存在相关...

    AES+RSA加密解密(js和java互通).zip

    5. 对象序列化与反序列化:在JS和Java间传递加密对象时,可能需要将加密结果转换为字符串(如Base64编码)以便在网络中传输。 总的来说,"AES+RSA加密解密(js和java互通)"项目旨在解决跨平台间的加密通信问题,...

Global site tag (gtag.js) - Google Analytics