java信用卡卡号算法,java实现主要信息的加密解密(模拟信用卡号的保存)
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实现主要信息的加密解密(模拟信用卡号的保存)相关推荐
- java 判断是否信用卡_《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)...
6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...
- java实现种子填充算法,Java编写图形学的种子填充算法
用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望 ...
- Java使用AES算法并指定密钥种子实现加密解密
Java使用AES指定密钥实现加密解密 一.生成密钥种子 二.使用生成的密钥种子加密 三.使用生成的密钥种子解密 四.AES完整加密解密代码工具类 一.生成密钥种子 import org.apache ...
- Java DES、AES、RSA、DM5读取文件加密解密
//下面代码是直接读取文件来进行加密解密,算法文件 package Test; import javax.crypto.KeyGenerator; import javax.crypto.Cipher ...
- aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- php算法入门,a011.PHP实战:加密解密,简单算法入门
原标题:a011.PHP实战:加密解密,简单算法入门 在PHP编程中,很多时候我们会遇到传递信息的问题,而传递过程中为了安全,我们肯定是要进行加密和解密的,这里,我们来说一说使用PHP怎么进行加密解密 ...
- java基础----数据结构与算法----Java API:集合 以及 排序相关API
概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map ...
- 排序算法java快速排序_快速排序算法--Java实现
标签(空格分隔): 数据结构与算法 原理: 对于任意一个无序数组,我们随机的选一个元素作为基准元素(例如:数组中的最后一个或者第一个元素, 然后我们将数组中的剩余元素分别与基准元素进行比较,将小于或等 ...
- 计算车号Java,汽车VIN码校验算法 java版
汽车17 位vin 码校验算法 1.[代码][Java]代码 import java.util.HashMap; import java.util.Map; public final class Vi ...
最新文章
- 苹果智能家居大招要来 两年一直没火真相解秘
- [置顶]Java Web学习总结(25)——MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建...
- 用Python找出数组中出现次数超过一半的数
- pip 和 conda 源更改
- MYSQL不同字段之间四则运算
- MySQL 中 delete 语句的子查询限制
- mysql archieve_mysql的archive储存引擎
- NameError: name 'long' is not defined
- 字符串(的基本操作,格式化,方法)
- cpu压测 windows_小白求问怎么用AIDA64进行CPU压力测试
- 打卡赠书,新一年的读者福利 !
- url怎么隐藏html后缀,去除url后缀(.html,.jsp等)的有效方法
- Python基础知识——5、字典
- 已知x=[[1]]*3,那么执行语句x[0][0]=5之后,变量x的值为 _____。
- string转map报错
- k开头的英文单词计算机专业,英语单词k字头
- netcat工具安装
- java微服务开发(基础环境篇)
- MIMIC-CXR数据集的下载
- 【ML】_00_03_梯度下降