最近用到加密的算法,记下来可以让自己以后阅读。
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;
}