前几日和同事聊天,说到经常忘记密码,但记在一些地方,又不放心。我们就想,要是实现一个加密算法,每次记录加密结果,需要时再解密,那问题不就迎刃而解了嘛。
后来根据需求,设计了一个基于异或的对称加密算法。算法非常简单:
1.先定义一个由一系列不规则字符组成的盐值(SALT),然后生成一个密钥,密钥是一个整数数组,里面的值随机生成,对应盐值字符串的下标。
2.加密时,根据密钥与盐值生成一个用来加密的字节数组。
3.通过这个字节数组,与被加密数据的字节数组进行异或操作
4.返回加密结果,由于异或的特性,解密过程同加密过程。
后来经过一些修改,将加密的字节数组转换为对应的16进制字符串(4位二进制表示一位16进制,根据这个规律生成)。这样就能将任何数据加密为一串字符串,解密时,先将这串字符串转换为对应的字节数组,再进行解密还原。
老规矩,上王者(呸,代码 最近有些沉迷游戏):
package com.myself.tryit;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA
* Date: 2017/12/8
* Time: 上午11:04
*
* @author 陈樟杰
*/
public class EncryptDecrypt {
/**
* 盐值
*/
private static final String SALT = "dfsad@#%$@TDGDF%$#%@#%WFRGFDHJKcvxznmfdsgdfgs2432534fgdf46t";
/**
* 内部密钥
*/
private static final int[] KEY = {
23, 22, 24, 4, 51, 26, 37, 27, 24, 6, 26, 38, 29, 35, 18, 21, 14, 3, 12, 4, 41, 39, 18, 44, 54, 21, 33, 35, 31, 22, 34, 53, 51, 44, 8, 12, 3, 0, 28, 1, 48, 9, 51, 57, 20, 44, 27, 3, 16, 48
};
/**
* 16进制映射表
*/
private static final Map MMP = new HashMap(12);
static {
short i = 10;
for (; i < 16; i+