Java常用加密算法實例總結(jié)
本文實例總結(jié)了Java常用加密算法。分享給大家供大家參考,具體如下:
項目中第一次深入地了解到加密算法的使用,現(xiàn)第一階段結(jié)束,將使用到的加密算法和大家分享一下:
首先還是先給大家普及一下常用加密算法的基礎(chǔ)知識
基本的單向加密算法
BASE64 嚴(yán)格地說,屬于編碼格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
復(fù)雜的加密算法
RSA(算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
DES/3DES(Digital Signature Algorithm,數(shù)字簽名)
國密算法
SM2/SM4(是由國家密碼管理局編制的一種商用密碼分組標(biāo)準(zhǔn)對稱算法)
使用方法:
base64
public static byte[] encode2Base64(byte[] bytes) {
byte[] bts = Base64.encodeBase64(bytes);
return bts;
}
public static byte[] decode2Base64(String str) {
byte[] bts = Base64.decodeBase64(str);
return bts;
}
MD5
public static String md5(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
return new String(digest.digest(str.getBytes()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
SHA-1
public static byte[] sha1ToBytes(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] bts = digest.digest(str.getBytes());
return bts;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
DES/3DES
public static byte[] encryptMode(String keyStr, byte[] src) {
try {
// 生成密鑰
SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede");
// 加密
Cipher c1 = Cipher.getInstance("DESede");
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
public static byte[] decryptMode(String keyStr, byte[] src) {
try {
SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede");
// 解密
Cipher c1 = Cipher.getInstance("DESede");
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
RSA
/**
* 初始化公密鑰
*
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA");
kpGenerator.initialize(2048);
KeyPair keyPair = kpGenerator.generateKeyPair();
// 存儲公鑰
PublicKey publicKey = keyPair.getPublic();
// 存儲密鑰
PrivateKey privateKey = keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>();
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
/**
* 取出公鑰
*
* @param keyMap
* @return
*/
public static String getPublicKey(Map<String, Object> keyMap) {
Key key = (Key) keyMap.get("RSAPublicKey");
return encode2Base64(new String(key.getEncoded()));
}
/**
* 取出密鑰
*
* @param keyMap
* @return
*/
public static String getPrivateKey(Map<String, Object> keyMap) {
Key key = (Key) keyMap.get("RSAPrivateKey");
return encode2Base64(new String(key.getEncoded()));
}
/**
* 公鑰加密
*
* @param data
* @param publicKey
* @return
* @throws Exception
*/
public static String encryptByPublicKey(String data, RSAPublicKey publicKey)
throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// 模長
int key_len = publicKey.getModulus().bitLength() / 8;
// 加密數(shù)據(jù)長度 <= 模長-11
String[] datas = splitString(data, key_len - 11);
String mi = "";
// 如果明文長度大于模長-11則要分組加密
for (String s : datas) {
mi += bcd2Str(cipher.doFinal(s.getBytes()));
}
return mi;
}
/**
* 私鑰加密
*
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static String encryptByPrivateKey(String data,
RSAPrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
// 模長
int key_len = privateKey.getModulus().bitLength() / 8;
// 加密數(shù)據(jù)長度 <= 模長-11
String[] datas = splitString(data, key_len - 11);
String mi = "";
// 如果明文長度大于模長-11則要分組加密
for (String s : datas) {
mi += bcd2Str(cipher.doFinal(s.getBytes()));
}
return mi;
}
/**
* 私鑰解密
*
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static String decryptByPrivateKey(String data,
RSAPrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
// 模長
int key_len = privateKey.getModulus().bitLength() / 8;
byte[] bytes = data.getBytes();
byte[] bcd = ASCII_To_BCD(bytes, bytes.length);
System.err.println(bcd.length);
// 如果密文長度大于模長則要分組解密
String ming = "";
byte[][] arrays = splitArray(bcd, key_len);
for (byte[] arr : arrays) {
ming += new String(cipher.doFinal(arr));
}
return ming;
}
/**
* ASCII碼轉(zhuǎn)BCD碼
*
*/
public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {
byte[] bcd = new byte[asc_len / 2];
int j = 0;
for (int i = 0; i < (asc_len + 1) / 2; i++) {
bcd[i] = asc_to_bcd(ascii[j++]);
bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));
}
return bcd;
}
public static byte asc_to_bcd(byte asc) {
byte bcd;
if ((asc >= '0') && (asc <= '9'))
bcd = (byte) (asc - '0');
else if ((asc >= 'A') && (asc <= 'F'))
bcd = (byte) (asc - 'A' + 10);
else if ((asc >= 'a') && (asc <= 'f'))
bcd = (byte) (asc - 'a' + 10);
else
bcd = (byte) (asc - 48);
return bcd;
}
/**
* BCD轉(zhuǎn)字符串
*/
public static String bcd2Str(byte[] bytes) {
char temp[] = new char[bytes.length * 2], val;
for (int i = 0; i < bytes.length; i++) {
val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
val = (char) (bytes[i] & 0x0f);
temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
}
return new String(temp);
}
/**
* 拆分字符串
*/
public static String[] splitString(String string, int len) {
int x = string.length() / len;
int y = string.length() % len;
int z = 0;
if (y != 0) {
z = 1;
}
String[] strings = new String[x + z];
String str = "";
for (int i = 0; i < x + z; i++) {
if (i == x + z - 1 && y != 0) {
str = string.substring(i * len, i * len + y);
} else {
str = string.substring(i * len, i * len + len);
}
strings[i] = str;
}
return strings;
}
/**
* 拆分?jǐn)?shù)組
*/
public static byte[][] splitArray(byte[] data, int len) {
int x = data.length / len;
int y = data.length % len;
int z = 0;
if (y != 0) {
z = 1;
}
byte[][] arrays = new byte[x + z][];
byte[] arr;
for (int i = 0; i < x + z; i++) {
arr = new byte[len];
if (i == x + z - 1 && y != 0) {
System.arraycopy(data, i * len, arr, 0, y);
} else {
System.arraycopy(data, i * len, arr, 0, len);
}
arrays[i] = arr;
}
return arrays;
}
以上就是本次項目中用到的加密算法,需要注意的是編碼格式一定要雙方統(tǒng)一 ,如果不一致則加解密不成功。
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
從ElasticSearch中刪除數(shù)據(jù)的幾種常見方式
這篇文章主要給大家介紹了關(guān)于從ElasticSearch中刪除數(shù)據(jù)的幾種常見方式,在Elasticsearch中刪除數(shù)據(jù)可以通過刪除索引或刪除文檔兩種方式實現(xiàn),需要的朋友可以參考下2024-10-10
Java?HashTable與Collections.synchronizedMap源碼深入解析
HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下2022-11-11
mybatis 如何利用resultMap復(fù)雜類型list映射
這篇文章主要介紹了mybatis 如何利用resultMap復(fù)雜類型list映射的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java 9中如何對IntegerCache進(jìn)行修改詳解
這篇文章主要給大家介紹了關(guān)于Java 9中如何對IntegerCache進(jìn)行修改的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。2017-12-12
詳解Spring Data JPA使用@Query注解(Using @Query)
本篇文章主要介紹了詳解Spring Data JPA使用@Query注解(Using @Query),具有一定的參考價值,有興趣的可以了解一下2017-07-07

