最近用到加密的算法,記下來可以讓自己以後閱讀。
AES是現在流行的高級加密法,每個key對應生成的的密匙都是不一樣的(對稱加密法都是這樣),也就是說就算同一個密碼不同的key生成的密匙是不同的。例如,key---->密匙:
admin---->admin。 superadmin---->admin 。
密匙是: 而這個的密匙是:
p9U+17cP9Yc1/0IudgdE5g== xLER7aR5TCbryeJujMJHNw==
首先要根據一個值生成一個key,可以是用戶輸入的。
然後使用
private void getKey(String strKey) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
//這個是密匙生成器,多種算法通用的。
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
// 使用用戶輸入的key,按照長度128初始化密匙生成器
keyGen.init(128, new SecureRandom(strKey.getBytes()));
this.key = keyGen.generateKey();
keyGen = null;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
獲取到一個key。
加密和解密。加密解密分爲兩種。一種是對byte數組的加密解密,一種是對String的加密解密。
對byte數組的加密解密:
加密:
private byte[] getEncCode(byte[] str) {
byte[] enc = null;
Cipher c;
try {
try {
c = Cipher.getInstance("AES");
try {
c.init(Cipher.ENCRYPT_MODE, key);
try {
// 加密,保存到enc
enc = c.doFinal(str);
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
} catch (InvalidKeyException e) {
e.printStackTrace();
}
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} finally {
c = null;
}
return enc;
}
解密:
private byte[] getDecCode(byte[] enc) {
byte[] dec = null;
Cipher c;
try {
c = Cipher.getInstance("AES");
try {
c.init(Cipher.DECRYPT_MODE, key);
try {
// 解密,保存到dec
dec = c.doFinal(enc);
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
} catch (InvalidKeyException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
c = null;
}
return dec;
}
本文出自 “Just do it” 博客,請務必保留此出處http://davenzeng.blog.51cto.com/3896952/989634