对订单进行加密解密的方法

 

// 加密算法

private static String ALGO = "AES";

// 转换模式(“算法/工作模式/填充模式”)

private static String transformation = "AES/CBC/NoPadding";

private static String ALGO_MODE = "AES/CBC/NoPadding";

private static String akey= " sdfe1***38dd12d4";

private static String aiv= "0321ebe***1f75de2";

/**

 *

 * @param Data

 *            传过来的数据:data=id+“,”+“price”,“timestamp”

 * @param akey

 *            定义秘钥规范所需要的参数

 * @param aiv

 *            定义秘钥参数规范需要的参数哦

 * @return

 * @throws Exception

 */

public static String encrypt(String Data, String akey, String aiv) throws Exception {

try {

// 获得一个加密解密的类(密码类)的实例转换方式其中算法是AES,工作模式为CBC,填充方式NoPadding

Cipher cipher = Cipher.getInstance(ALGO_MODE);

// 获得相应块的大小(密码类块的大小)

int blockSize = cipher.getBlockSize();

// 把传过来的 数据字符串达成字节的形式的数组中

byte[] dataBytes = Data.getBytes();

// 获得该字节数组的长度

int plaintextLength = dataBytes.length;

 

if (plaintextLength % blockSize != 0) {

// 如果该字节数组的长度对相应块的大小去模有余,则增加该字节数组的长度(增加的长度为该相应块的值-字节数组长度对块取模的值),其目的主要是让数组长度对块的值取模后值为0

plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));

}

// 已更改后的自己数组的长度为单位new一个新的字节数组

byte[] plaintext = new byte[plaintextLength];

// dataBytes被复制的数组,0:被复制数组的起始位置,plaintext:备用数组(dataBytes里的内容要被复制在这个数组里面);dataBytes.length:被复制数组的长度

System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

// 上述代码的意思是指把dataBytes数组里的内容从0的位置到最后的位置全部复制到plaintext数组中,其主要目的就是让dataBytes数组的长度对加密解密类的块的大小取模之后的值为0

 

// 把秘钥打成一个字节数组,采用"AES"的算法构建一个秘钥规范(SecretKeySpec为秘钥规范类他实现了KeySpec接口)

SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);

// iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途,因此iv通过随机方式产生,是简便有效的途径

// IvParameterSpec主要是用来规范加密参数的一个实现类

IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));

// 初始化加密解密的类Cipher.ENCRYPT_MODE:表明这个加密解密的类主要功能是加密,keyspec:秘钥规范;ivspec:加密参数的规范

cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

// 对数据进行最终处理,生成一个新的数组即被加密后的数组

byte[] encrypted = cipher.doFinal(plaintext);

// 把加密后的字节数组进行base64进行编码,编码后形成新的字符串

String EncStr = new sun.misc.BASE64Encoder().encode(encrypted);

return EncStr;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

 *

 * @param encryptedData

 *            被加密的数据

 * @param akey

 *            秘钥规范类所需要的参数

 * @param aiv

 *            秘钥参数规范类所需要的参数

 * @return 被解密的字符串

 * @throws Exception

 */

public static String decrypt(String encryptedData, String akey, String aiv) throws Exception {

try {

// 把被加密的数字按照base64的形式进行解码生成一个字节数组

byte[] encrypted1 = new sun.misc.BASE64Decoder().decodeBuffer(encryptedData);

// 创建一个加密解密的类(密码类)

Cipher cipher = Cipher.getInstance(ALGO_MODE);

// 把密文打成一个字节数组的形式,按照“AESC”的加密算法创建一个密文规范类

SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);

// 把注入值打成字节数组创建一个密文注入值参数规范类

IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));

// 初始化加密解密类并把其初始化成解密的类

cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

// 把需要解密的数据字节数组进行最后处理,还原成原来的数据字节数组

byte[] original = cipher.doFinal(encrypted1);

// 把原始字节数组变成字符串

String originalString = new String(original);

return originalString;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

猜你喜欢

转载自blog.csdn.net/qq_39879632/article/details/81458217