java实现重要信息的加密解密(模拟信用卡号的保存)

package cn.felay.io;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

/**
 * 自定义序列化对象信息(加密保存重要信息)
 *
 * @author <a mailto:[email protected]>felayman</a>
 * @timer 2014年6月10日 下午8:10:29
 */
public class ExternalizableDemo {

	public static void main(String[] args) {
		Customer customer;
		try {
			// 构造一个信用卡用户
			customer = new Customer(1, "1234-5678-9876");
			// 打印加密前的信用卡信息
			System.out.println("before saving object:");
			System.out.println("ID:" + customer.getId() + ",CC:"
					+ customer.getCreditCard());
			// 创建对象输出流,该流是给予文件输出流的,即该流的数据是从文件中获取的,下面两行代码表示创建一个写入到指定文件的对象输出流
			ObjectOutputStream outStream = new ObjectOutputStream(
					new FileOutputStream("src/res/customer.dat"));
			// 将创建号的信用卡用户保存到customer.dat文件中
			outStream.writeObject(customer);
			outStream.close();// 关闭流
			// 创建一个从指定文件读取内容的输入流
			ObjectInputStream inputStream = new ObjectInputStream(
					new FileInputStream("src/res/customer.dat"));
			// 将读取的对象保存到
			customer = (Customer) inputStream.readObject();
			System.out.println("after retreieving object");// 输出解密后的对象信息
			System.out.println("ID:" + customer.getId() + ",CC:"
					+ customer.getCreditCard());
			inputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
}

class Customer implements Externalizable {

	private int id; // ID号
	private String creditCard; // 信用卡号
	private static Cipher cipher; // 加密和解密
	private static SecretKeySpec secretKeySpec; // 密钥

	public Customer() {
		this.id = 0;
		this.creditCard = "";
	}

	// 该实例保存用户的id号和信用卡号
	public Customer(int id, String creditCard) {
		this.id = id;
		this.creditCard = creditCard;
	}

	static {
		try {
			createCipher(); // 创建一个加密解密机
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("加密过程出现错误");
			System.exit(1);
		}
	}

	public int getId() {
		return this.id;
	}

	private static void createCipher() throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");// Rijndael加密算法
		kgen.init(128); // 指定生成的密钥长度为128位
		SecretKeySpec skey = (SecretKeySpec) kgen.generateKey();// 根据Rijndael加密算法生成一个密钥,并将密钥以字节数组方式保存到SecretKeySpec对象中
		byte[] raw = skey.getEncoded();// 将生成的密钥保存到字节数组中
		secretKeySpec = new SecretKeySpec(raw, "AES");// 密钥转换,将上述的密钥保存到Customer类的属性中,防止失效
		cipher = Cipher.getInstance("AES");// 将算法密钥保存到该对象中以实现解密功能
	}

	public String getCreditCard() {
		return this.creditCard;
	}

	public static Cipher getCipher() {
		return cipher;
	}

	public static SecretKeySpec getSecretKeySpec() {
		return secretKeySpec;
	}

	// 保存密钥
	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		try {
			out.write(this.id);
			this.encript();
			out.writeUTF(this.creditCard);
			System.out.println("after encryption:");// 加密后
			System.out.println("id:" + this.id + ",CC:" + this.creditCard);
		} catch (InvalidKeyException | IllegalBlockSizeException
				| BadPaddingException e) {
			e.printStackTrace();
		}
	}

	// 读取密钥
	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		this.id = in.read();
		String str = in.readUTF();
		this.decrypt(str);
	}

	// 加密
	private void encript() throws InvalidKeyException,
			IllegalBlockSizeException, BadPaddingException {
		cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
		byte[] buff = cipher.doFinal(this.creditCard.getBytes());
		this.creditCard = new String(buff);
	}

	// 解密
	private void decrypt(String str) {
		try {
			cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
			byte[] buff = cipher.doFinal(str.getBytes());
			this.creditCard = new String(buff);
		} catch (InvalidKeyException | IllegalBlockSizeException
				| BadPaddingException e) {
			e.printStackTrace();
		}

	}

}

java实现重要信息的加密解密(模拟信用卡号的保存),布布扣,bubuko.com

时间: 2024-12-06 06:50:35

java实现重要信息的加密解密(模拟信用卡号的保存)的相关文章

关于 Des加密(Android与ios 与后台java服务器之间的加密解密)

关于 Des加密(Android与ios  与后台java服务器之间的加密解密) http://blog.sina.com.cn/s/blog_7c8dc2d50101id91.html (2013-04-17 11:47:23)   分类: iPhone开发 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的DES加密的时候遇到了一些问题,起初怎么调都调不

用JAVA实现的DES加密解密算法

package Encrypt; import java.security.*; import javax.crypto.*; import sun.misc.*; /** * 使用DES加密与解密,可对byte[],String类型进行加密与解密 * 密文可使用String,byte[]存储. * 方法: * void getKey(String strKey)从strKey的字条生成一个Key * String getEncString(String strMing)对strMing进行加密

SM4加密算法实现Java和C#相互加密解密

SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比如:byte在Java中范围是-127~128,而C#中的范围是0~255,这就导致使用C#的加密的明文产生的密文到Java中解密不正确.再一次偶尔的上网中看到了这篇文章 https://www.cnblogs.com/wyongbo/p/jnaTest.

.NET/andriod/java/iOS AES通用加密解密

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都实践了一遍,实现了.NET,java(andriod),iOS都同一套的加密算法,下面就分享给大家. AES加密有多种算法模式,下面提供两套模式的可用源码. 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一.CBC(Cipher Blo

javaScript base64算法的实现 与 java中的base64 加密 解密

前段时间,工作需要,需要用js和java配套的base64算法,奈何没找到,然后网上抄一套.用起来还是很有效的. 闲言少絮,直接上干货. js 版base 64 算法  base64.js var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; //将Ansi编码的字符串进行Base64编码 function encode64(input) { var output = &quo

Java对称与非对称加密解密,AES与RSA

加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么要有非对称加密,解密技术呢 假设这样一种场景A要发送一段消息给B,但是又不想以明文发送,所以就需要对消息进行加密.如果采用对称加密技术,那么加密与解密用的是同一把秘钥.除非B事先就知道A的秘钥,并且保存好.这样才可以解密A发来的消息. 由于对称技术只有一把秘钥,所以秘钥的管理是一个很麻烦的问题.而非

JAVA和C# 3DES加密解密

原文转自:http://blog.csdn.net/sdfkfkd/article/details/6004847 最近 一个项目.net 要调用Java的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byte范围为-128至127,c#的Byte范围是0-255核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章一个是C#采用CBC Mode,PKCS7 Pa

Java中使用BASE64加密&amp;解密

package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * @title BASE64加密&解密 * @description * 邮件,HTTP协议,一般用户名及密码 * @author Administrator * @date 2015-7-16 *

java&amp;Ios rsa 进行加密解密

最近公司要准备做一个传输数据加密准备用RSA 首先说一下自己开发中越到到坑 开始后台做给了我字符串格式的公钥.私钥做调试 后台自己加密.解密.加签.验签,都没有问题, 我这边同样也是加密.解密.加签.验签都没有问题 加密每次都是不同的,但是加签只要铭文固定,结果是一样 问题出在,同样的铭文,前端和后台加签出来不结果 最后和后台讨论用我们前端生成的文件进行加密解密 一.首先说一下生成公钥.私钥.证书的过程 openssl genrsa -out private_key.pem 1024 opens