加密法(AES,MD5)----對byte[]加密
最近用到加密的演算法,記下來可以讓自己以後閱讀。
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;
}