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`可能就是一个很好的学习资源,帮助开发者掌握这些技能。
5. **加密与解密**:为了增强安全性,序列化后的数据可能会通过加密算法(如AES)进行加密,然后在反序列化前解密。加密过程需要妥善管理密钥,以确保只有授权方能解密数据。 6. **Session存储**:在ASP.NET中,...
在IT行业中,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和对象持久化等场景中。在C#编程语言中,这些技术被广泛使用,尤其是在处理用户登录信息时,如用户名和密码的安全存储和传输。本文将详细...
在跨平台通信中,数据的序列化和反序列化是关键。由于C/C++和Java的数据表示方式可能存在差异,我们需要确保加密后的字节序列在两者的环境中都能正确解析。例如,C/C++中的字节序可能是大端或小端,而Java默认使用...
在C语言中实现AES加密解密,需要理解AES的工作原理和C语言编程的基本概念。 AES的核心是基于替换和置换的组合,通过一系列复杂的数学操作(如字节代换、行位移、列混淆和轮密钥加)对明文进行加密,然后通过相反的...
【AES加密与解密】 AES(Advanced Encryption Standard)是一种常用的对称加密算法。在Shiro的反序列化漏洞中,AES用于加密RememberMe令牌。其主要参数包括: - mode:加密模式,如CBC(Cipher Block Chaining)模式...
2. 密钥和IV的序列化:将它们转换为字节数组并保存,确保字节顺序一致。 3. 加密:在C/C++和Java中实现AES加密算法,处理输入的明文数据。 4. 解密:在另一端实现AES解密算法,还原加密后的数据。 5. 检验:解密后,...
在AES加密后的密文是二进制格式,不便于直接显示或传输,通过Base64编码,可以将密文转换为可读的字符序列,方便处理。 为了在Linux上实现这个功能,开发者需要理解以下几个关键点: - **C库的使用**:Linux上常见...
在C++环境中实现AES加密算法,通常涉及到的关键概念包括密钥、明文、密文、加密过程和解密过程。源码中可能包含的文件如AES.cpp和AES.h,分别对应实现类或函数的主体部分和头文件定义。 AES算法基于一个固定大小的...
在微信小程序中,AES加密常用于服务器与客户端之间的通信,以确保数据在传输过程中的安全性。 首先,要实现微信小程序的AES加密,你需要在项目中引入相关的加密库。在这个压缩包中,提供了一个名为`utils`的文件夹...
- 加密循环:对每个128位的数据块执行AES加密,并与计数器的加密结果异或。 - 解密过程:因为CTR模式是可逆的,解密只需重复加密过程。 源代码的具体实现细节会涉及C++编程语言,包括如何使用库函数(如OpenSSL的...
- 将加密后的块、密钥和IV序列化,以便于存储和传输。 - 解密时,按照相反的顺序操作。 7. **安全存储**:加密后的数据和相关元数据(如密钥和IV)应安全地存储,可以使用SQLite数据库或其他安全的存储方式。 8....
在这个开源项目中,我们将探讨如何在Android和iOS平台上实现AES加密。以下是对这个项目的详细讲解。 1. **AES加密原理**: AES是基于块密码,每个加密块大小为128位。它使用128、192或256位的密钥来加密128位的...
在"vc AES加密算法接口及演示程序最新版下载"中,"vc"通常指的是Visual C++,这意味着提供的资源可能是一个用C++编写的AES加密库或示例程序。这个资源可能包含了AES加密的API接口,允许开发者在C++项目中方便地集成...
使用这个组件,开发者可以轻松地集成AES加密到他们的应用程序中,以保护敏感数据。 总之,这个示例通过DELPHI展示了AES加密解密的基本操作,包括文件和内容的处理。通过理解和使用这些代码,开发者可以提升他们应用...
根据给定的文件信息,我们可以总结出以下关于AES加密算法的知识点: ### 一、AES加密算法概述 AES(Advanced Encryption Standard),即高级加密标准,是一种对称加密算法,用于数据的安全传输。它是由比利时密码...
在这款应用中,Json可能被用作数据存储格式,用于序列化和反序列化用户的笔记内容和元数据,以便于在内存中操作和持久化到磁盘。 5. **Clion+cmake**:Clion是JetBrains公司开发的一款C++集成开发环境,提供了强大...
本篇文章将详细讲解如何在C++环境下实现一个支持中文字符和无限长度明文的AES加密与解密系统,以及涉及的相关技术点。 AES,全称为高级加密标准,是一种广泛使用的对称加密算法,它基于块密码,通常以128位(16字节...
4. 漏洞影响范围:只要Remember Me的AES加密密钥被泄露,无论Shiro的版本如何,都可能触发反序列化漏洞。 5. 检测Shiro使用:通过检查登录响应包是否存在Remember Me标记,或者修改登录请求的Cookie,若存在相关...
5. 对象序列化与反序列化:在JS和Java间传递加密对象时,可能需要将加密结果转换为字符串(如Base64编码)以便在网络中传输。 总的来说,"AES+RSA加密解密(js和java互通)"项目旨在解决跨平台间的加密通信问题,...