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 felayman

* @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信用卡卡号算法,java实现主要信息的加密解密(模拟信用卡号的保存)相关推荐

  1. java 判断是否信用卡_《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)...

    6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...

  2. java实现种子填充算法,Java编写图形学的种子填充算法

    用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望 ...

  3. Java使用AES算法并指定密钥种子实现加密解密

    Java使用AES指定密钥实现加密解密 一.生成密钥种子 二.使用生成的密钥种子加密 三.使用生成的密钥种子解密 四.AES完整加密解密代码工具类 一.生成密钥种子 import org.apache ...

  4. Java DES、AES、RSA、DM5读取文件加密解密

    //下面代码是直接读取文件来进行加密解密,算法文件 package Test; import javax.crypto.KeyGenerator; import javax.crypto.Cipher ...

  5. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  6. php算法入门,a011.PHP实战:加密解密,简单算法入门

    原标题:a011.PHP实战:加密解密,简单算法入门 在PHP编程中,很多时候我们会遇到传递信息的问题,而传递过程中为了安全,我们肯定是要进行加密和解密的,这里,我们来说一说使用PHP怎么进行加密解密 ...

  7. java基础----数据结构与算法----Java API:集合 以及 排序相关API

    概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map   ...

  8. 排序算法java快速排序_快速排序算法--Java实现

    标签(空格分隔): 数据结构与算法 原理: 对于任意一个无序数组,我们随机的选一个元素作为基准元素(例如:数组中的最后一个或者第一个元素, 然后我们将数组中的剩余元素分别与基准元素进行比较,将小于或等 ...

  9. 计算车号Java,汽车VIN码校验算法 java版

    汽车17 位vin 码校验算法 1.[代码][Java]代码 import java.util.HashMap; import java.util.Map; public final class Vi ...

最新文章

  1. 苹果智能家居大招要来 两年一直没火真相解秘
  2. [置顶]Java Web学习总结(25)——MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建...
  3. 用Python找出数组中出现次数超过一半的数
  4. pip 和 conda 源更改
  5. MYSQL不同字段之间四则运算
  6. MySQL 中 delete 语句的子查询限制
  7. mysql archieve_mysql的archive储存引擎
  8. NameError: name 'long' is not defined
  9. 字符串(的基本操作,格式化,方法)
  10. cpu压测 windows_小白求问怎么用AIDA64进行CPU压力测试
  11. 打卡赠书,新一年的读者福利 !
  12. url怎么隐藏html后缀,去除url后缀(.html,.jsp等)的有效方法
  13. Python基础知识——5、字典
  14. 已知x=[[1]]*3,那么执行语句x[0][0]=5之后,变量x的值为 _____。
  15. string转map报错
  16. k开头的英文单词计算机专业,英语单词k字头
  17. netcat工具安装
  18. java微服务开发(基础环境篇)
  19. MIMIC-CXR数据集的下载
  20. 【ML】_00_03_梯度下降

热门文章

  1. 5项基因改造让你拥抱大财富
  2. Java spring boot 实现支付宝支付
  3. 面试攻略!Java 基础面试 100 问
  4. 20210510_AI方面常见试题
  5. lopa分析_LOPA分析法之独立保护层浅析
  6. 【POJ3710】Christmas Game 博弈 有限制的图上删边游戏(树形删边游戏进化1)
  7. LeetCode-----第139题-----单词拆分
  8. 软考 软件设计师 第五版+历年真题
  9. 理解JavaScript Call()函数原理。
  10. 电脑微信QQ正常登录,浏览器无法访问网站