java的加密解密方法收集
package com.utils;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.*; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey;
/**
Created by liuyang on 2014/10/28. */ public class CryptDemo {
/**
- 進行MD5加密 *
- @param info
- 要加密的信息
- @return String 加密后的字符串
*/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
} catch (NoSuchAlgorithmException e) {// 得到一個md5的消息摘要 MessageDigest alga = MessageDigest.getInstance("MD5"); // 添加要進行計算摘要的信息 alga.update(info.getBytes()); // 得到該摘要 digesta = alga.digest();
} // 將摘要轉為字符串 String rs = byte2hex(digesta); return rs; } /**e.printStackTrace();
- 進行SHA加密 *
- @param info
- 要加密的信息
- @return String 加密后的字符串
*/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
} catch (NoSuchAlgorithmException e) {// 得到一個SHA-1的消息摘要 MessageDigest alga = MessageDigest.getInstance("SHA-1"); // 添加要進行計算摘要的信息 alga.update(info.getBytes()); // 得到該摘要 digesta = alga.digest();
} // 將摘要轉為字符串 String rs = byte2hex(digesta); return rs; } // ////////////////////////////////////////////////////////////////////////// /**e.printStackTrace();
- 創建密匙 *
- @param algorithm
- 加密算法,可用 DES,DESede,Blowfish
- @return SecretKey 秘密(對稱)密鑰
*/
public SecretKey createSecretKey(String algorithm) {
// 聲明KeyGenerator對象
KeyGenerator keygen;
// 聲明 密鑰對象
SecretKey deskey = null;
try {
} catch (NoSuchAlgorithmException e) {// 返回生成指定算法的秘密密鑰的 KeyGenerator 對象 keygen = KeyGenerator.getInstance(algorithm); // 生成一個密鑰 deskey = keygen.generateKey();
} // 返回密匙 return deskey; } /**e.printStackTrace();
- 根據密匙進行DES加密 *
- @param key
- 密匙
- @param info
- 要加密的信息
- @return String 加密后的信息
*/
public String encryptToDES(SecretKey key, String info) {
// 定義 加密算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密隨機數生成器 (RNG),(可以不寫)
SecureRandom sr = new SecureRandom();
// 定義要生成的密文
byte[] cipherByte = null;
try {
} catch (Exception e) {// 得到加密/解密器 Cipher c1 = Cipher.getInstance(Algorithm); // 用指定的密鑰和模式初始化Cipher對象 // 參數:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE) c1.init(Cipher.ENCRYPT_MODE, key, sr); // 對要加密的內容進行編碼處理, cipherByte = c1.doFinal(info.getBytes());
} // 返回密文的十六進制形式 return byte2hex(cipherByte); } /**e.printStackTrace();
- 根據密匙進行DES解密 *
- @param key
- 密匙
- @param sInfo
- 要解密的密文
- @return String 返回解密后信息
*/
public String decryptByDES(SecretKey key, String sInfo) {
// 定義 加密算法,
String Algorithm = "DES";
// 加密隨機數生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
} catch (Exception e) {// 得到加密/解密器 Cipher c1 = Cipher.getInstance(Algorithm); // 用指定的密鑰和模式初始化Cipher對象 c1.init(Cipher.DECRYPT_MODE, key, sr); // 對要解密的內容進行編碼處理 cipherByte = c1.doFinal(hex2byte(sInfo));
} // return byte2hex(cipherByte); return new String(cipherByte); } // ///////////////////////////////////////////////////////////////////////////// /**e.printStackTrace();
- 創建密匙組,并將公匙,私匙放入到指定文件中 *
- 默認放入mykeys.bat文件中
*/
public void createPairKey() {
try {
} catch (NoSuchAlgorithmException e) {// 根據特定的算法一個密鑰對生成器 KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA"); // 加密隨機數生成器 (RNG) SecureRandom random = new SecureRandom(); // 重新設置此隨機對象的種子 random.setSeed(1000); // 使用給定的隨機源(和默認的參數集合)初始化確定密鑰大小的密鑰對生成器 keygen.initialize(512, random);// keygen.initialize(512); // 生成密鑰組 KeyPair keys = keygen.generateKeyPair(); // 得到公匙 PublicKey pubkey = keys.getPublic(); // 得到私匙 PrivateKey prikey = keys.getPrivate(); // 將公匙私匙寫入到文件當中 doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });
} } /**e.printStackTrace();
- 利用私匙對信息進行簽名 把簽名后的信息放入到指定的文件中 *
- @param info
- 要簽名的信息
- @param signfile
- 存入的文件 */ public void signToInfo(String info, String signfile) { // 從文件當中讀取私匙 PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1); // 從文件中讀取公匙 PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2); try { // Signature 對象可用來生成和驗證數字簽名 Signature signet = Signature.getInstance("DSA"); // 初始化簽署簽名的私鑰 signet.initSign(myprikey); // 更新要由字節簽名或驗證的數據 signet.update(info.getBytes()); // 簽署或驗證所有更新字節的簽名,返回簽名 byte[] signed = signet.sign(); // 將數字簽名,公匙,信息放入文件中 doObjToFile(signfile, new Object[] { signed, mypubkey, info }); } catch (Exception e) { e.printStackTrace(); } } /**
- 讀取數字簽名文件 根據公匙,簽名,信息驗證信息的合法性 *
- @return true 驗證成功 false 驗證失敗
*/
public boolean validateSign(String signfile) {
// 讀取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
// 讀取簽名
byte[] signed = (byte[]) getObjFromFile(signfile, 1);
// 讀取信息
String info = (String) getObjFromFile(signfile, 3);
try {
} catch (Exception e) {// 初始一個Signature對象,并用公鑰和簽名進行驗證 Signature signetcheck = Signature.getInstance("DSA"); // 初始化驗證簽名的公鑰 signetcheck.initVerify(mypubkey); // 使用指定的 byte 數組更新要簽名或驗證的數據 signetcheck.update(info.getBytes()); System.out.println(info); // 驗證傳入的簽名 return signetcheck.verify(signed);
} } /**e.printStackTrace(); return false;
- 將二進制轉化為16進制字符串 *
- @param b
- 二進制字節數組
- @return String
*/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
} return hs.toUpperCase(); } /**stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; }
- 十六進制字符串轉化為2進制 *
- @param hex
- @return
*/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++) {
} return ret; } /**ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
- 將兩個ASCII字符合成一個字節; 如:"EF"--> 0xEF *
- @param src0
- byte
- @param src1
- byte
- @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
_b0 = (byte) (_b0 << 4); byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
byte ret = (byte) (_b0 ^ _b1); return ret; } /**.byteValue();
- 將指定的對象寫入指定的文件 *
- @param file
- 指定寫入的文件
- @param objs
- 要寫入的對象 */ public void doObjToFile(String file, Object[] objs) { ObjectOutputStream oos = null; try { FileOutputStream fos = new FileOutputStream(file); oos = new ObjectOutputStream(fos); for (int i = 0; i < objs.length; i++) { oos.writeObject(objs[i]); } } catch (Exception e) { e.printStackTrace(); } finally { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } /**
- 返回在文件中指定位置的對象 *
- @param file
- 指定的文件
- @param i
- 從1開始
- @return
*/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
} catch (Exception e) {FileInputStream fis = new FileInputStream(file); ois = new ObjectInputStream(fis); for (int j = 0; j < i; j++) { obj = ois.readObject(); }
} finally {e.printStackTrace();
} return obj; } /**try { ois.close(); } catch (IOException e) { e.printStackTrace(); }
- 測試 *
- @param args
*/
public static void main(String[] args) {
CryptDemo jiami = new CryptDemo();
// 執行MD5加密"Hello world!"
System.out.println("Hello經過MD5:" + jiami.encryptToMD5("Hello"));
// 生成一個DES算法的密匙
SecretKey key = jiami.createSecretKey("DES");
// 用密匙加密信息"Hello world!"
String str1 = jiami.encryptToDES(key, "Hello");
System.out.println("使用des加密信息Hello為:" + str1);
// 使用這個密匙解密
String str2 = jiami.decryptByDES(key, str1);
System.out.println("解密后為:" + str2);
// 創建公匙和私匙
jiami.createPairKey();
// 對Hello world!使用私匙進行簽名
jiami.signToInfo("Hello", "mysign.bat");
// 利用公匙對簽名進行驗證。
if (jiami.validateSign("mysign.bat")) {
} else {System.out.println("Success!");
} } }</pre>System.out.println("Fail!");
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!