在线加密地址:点击打开链接
//编码方式
public static final String bm = "UTF-8";
/**
* 功能说明: AES加密/CFB8
* @param data 待加密字符串
* @param vector 向量
* @param passwd 密钥
* @return
*/
public static String encryptCFB8(String data,String passwd) {
try {
/***生成密钥***/
SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES");
/***AES/CFB8/NOPADDING模式***/
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
/***加密***/
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
byte[] encryptedData = cipher.doFinal(data.getBytes(bm));
return new BASE64Encoder().encode(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 功能说明: AES解密/CFB8
* @param data 待解密字符串
* @param vector 向量
* @param passwd 密钥
* @return
*/
public static String decryptCFB8(String data,String passwd) {
try {
byte[] byteMi = new BASE64Decoder().decodeBuffer(data);
SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedData = cipher.doFinal(byteMi);
return new String(decryptedData, bm);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 功能说明: 随机生成16位的密钥
* @return
*/
public static String createPasswdRandom(){
String passWd = getRandomStr(16);
return passWd;
}
/**
* 功能说明:生成指定长度的随机数,不足位数前补0
* @param l
* @return
*/
public static String getRandomStr(int l){
int ranL = 19;
if(l < ranL){
ranL = l;
}
String maxL = formatStr(String.valueOf(ranL),ranL);
Long maxI = Long.parseLong(maxL);
long s = (long)(maxI*Math.random());
String result = String.format("%0" + l + "d", s);
return result;
}
/**
* 功能说明: 不足位数右补0
* @param str
* @param maxL
* @return
*/
public static String formatStr(String str,int maxL){
int l = str.length();
if(maxL > l){
for(int i=0;i<maxL-l;i++){
str = str + "0";
}
}
return str;
}
/**
* 测试
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String content = "201801023536111222";
String passwd = "1234567890123456";
System.out.println(passwd);
// 加密
System.out.println("加密前:" + content);
String encryptResult = encryptCFB8(content,passwd);
System.out.println("加密后:" + new String(encryptResult));
// 解密
String decryptResult = decryptCFB8(encryptResult,passwd);
System.out.println("解密后:" + new String(decryptResult));
}
对称加密:加解密都是用的一个秘钥。AES,DES,3DES
非对称加密:一个私有秘钥,一个共有秘钥。一个加密,必须用另外一个解密。RSA ,DSA
不要向量:
//编码方式
public static final String bm = "UTF-8";
/**
* 功能说明: AES加密/CFB8
* @param data 待加密字符串
* @param vector 向量
* @param passwd 密钥
* @return
*/
public static String encryptCFB8(String data,String passwd) {
try {
/***生成密钥***/
SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES");
/***AES/CFB8/NOPADDING模式***/
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
/***加密***/
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
byte[] encryptedData = cipher.doFinal(data.getBytes(bm));
return new BASE64Encoder().encode(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 功能说明: AES解密/CFB8
* @param data 待解密字符串
* @param vector 向量
* @param passwd 密钥
* @return
*/
public static String decryptCFB8(String data,String passwd) {
try {
byte[] byteMi = new BASE64Decoder().decodeBuffer(data);
SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedData = cipher.doFinal(byteMi);
return new String(decryptedData, bm);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 功能说明: 随机生成16位的密钥
* @return
*/
public static String createPasswdRandom(){
String passWd = getRandomStr(16);
return passWd;
}
/**
* 功能说明:生成指定长度的随机数,不足位数前补0
* @param l
* @return
*/
public static String getRandomStr(int l){
int ranL = 19;
if(l < ranL){
ranL = l;
}
String maxL = formatStr(String.valueOf(ranL),ranL);
Long maxI = Long.parseLong(maxL);
long s = (long)(maxI*Math.random());
String result = String.format("%0" + l + "d", s);
return result;
}
/**
* 功能说明: 不足位数右补0
* @param str
* @param maxL
* @return
*/
public static String formatStr(String str,int maxL){
int l = str.length();
if(maxL > l){
for(int i=0;i<maxL-l;i++){
str = str + "0";
}
}
return str;
}
/**
* 测试
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String content = "201801023536111222";
String passwd = "1234567890123456";
System.out.println(passwd);
// 加密
System.out.println("加密前:" + content);
String encryptResult = encryptCFB8(content,passwd);
System.out.println("加密后:" + new String(encryptResult));
// 解密
String decryptResult = decryptCFB8(encryptResult,passwd);
System.out.println("解密后:" + new String(decryptResult));
}
String s = "我的中国新+?&";
byte[] bytes = s.getBytes();
String s1 = new String(Hex.encodeHex(bytes));
System.out.println(s1);
byte[] bytes1 = Hex.decodeHex(s1.toCharArray());
System.out.println(new String(bytes1));
这里的Aes加密解密方法使用Hex进行了编码解码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
package
com.baidu.wallet.bdwallet.utils;
import
java.io.UnsupportedEncodingException;
import
java.security.InvalidKeyException;
import
java.security.NoSuchAlgorithmException;
import
javax.crypto.BadPaddingException;
import
javax.crypto.Cipher;
import
javax.crypto.IllegalBlockSizeException;
import
javax.crypto.NoSuchPaddingException;
import
javax.crypto.spec.SecretKeySpec;
import
org.apache.commons.codec.DecoderException;
import
org.apache.commons.codec.binary.Hex;
public
class
Test {
private
static
final
String AES=
"AES"
;
private
static
final
String UTF8=
"UTF-8"
;
/**
* AES加密
* @param content
* @param pkey
* @return
* @throws DecoderException
*/
private
static
byte
[] encrypt(String content, String pkey)
throws
DecoderException {
try
{
String private_key=pkey;
byte
[] encodeFormat=
null
;
try
{
//秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码
encodeFormat = Hex.decodeHex(private_key.toCharArray());
}
catch
(DecoderException e) {
e.printStackTrace();
}
SecretKeySpec key =
new
SecretKeySpec(encodeFormat, AES);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(
"AES/ECB/PKCS5Padding"
);
// 加密内容进行编码
byte
[] byteContent = content.getBytes(UTF8);
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, key);
// 正式执行加密操作
byte
[] result = cipher.doFinal(byteContent);
return
result;
}
catch
(NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch
(NoSuchPaddingException e) {
e.printStackTrace();
}
catch
(InvalidKeyException e) {
e.printStackTrace();
}
catch
(UnsupportedEncodingException e) {
e.printStackTrace();
}
catch
(IllegalBlockSizeException e) {
e.printStackTrace();
}
catch
(BadPaddingException e) {
e.printStackTrace();
}
return
null
;
}
/**
* AES解密
* @param contents
* @param password
* @return
* @throws DecoderException
*/
private
static
byte
[] decrypt(String contents, String password)
throws
DecoderException {
try
{
//密文使用Hex解码
byte
[]content = Hex.decodeHex(contents.toCharArray());
//秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码
byte
[] encodeFormat = Hex.decodeHex(password.toCharArray());
SecretKeySpec key =
new
SecretKeySpec(encodeFormat, AES);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(AES);
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, key);
// 正式执行解密操作
byte
[] result = cipher.doFinal(content);
return
result;
}
catch
(NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch
(NoSuchPaddingException e) {
e.printStackTrace();
}
catch
(InvalidKeyException e) {
e.printStackTrace();
}
catch
(IllegalBlockSizeException e) {
e.printStackTrace();
}
catch
(BadPaddingException e) {
e.printStackTrace();
}
return
null
;
}
/**
* Aes加密
* @param context 明文
* @param private_key 秘钥
* @return
* @throws DecoderException
*/
public
static
String encryption(String context,String private_key)
throws
DecoderException{
//加密后的明文也就变成了密文
byte
[] encryptResult = encrypt(context, private_key);
//密码文Hex编码
String encryptResultStr = Hex.encodeHexString(encryptResult);
return
encryptResultStr;
}
/**
* Aes解密
* @param context 密文
* @param private_key 秘钥
* @return
* @throws DecoderException
* @throws UnsupportedEncodingException
*/
public
static
String decryption(String context,String private_key)
throws
DecoderException, UnsupportedEncodingException{
//这里的密文解密前先进行了Hex解码
byte
[] decryptResult = decrypt(context, private_key);
String result =
new
String(decryptResult, UTF8);
return
result;
}
public
static
void
main(String[] args)
throws
UnsupportedEncodingException, DecoderException {
//加密内容
String content =
"123456787654321"
;
//AES加密解密秘钥
String password =
"这个值一般都是给定的,双发都知道"
;
// 加密
System.out.println(
"加密前:"
+ content);
// 调用加密方法
String encryptResultStr = encryption(content, password);
System.out.println(
"加密后:"
+ encryptResultStr);
// 调用解密方法
String result = decryption(encryptResultStr, password);
// 解密内容进行解码
System.out.println(
"解密后:"
+ result);
}
}
|