前兩天在做一個項目時需要對文本内容進行3DES加密,利用一個33位自定義的種子秘鑰,使用秘鑰工廠生成一個新的秘鑰去做加密處理.直接上代碼.
加密過程:`
public static String getTripleDES(String Str,String keyStr){
Key key = null;
try {
KeyGenerator _generator = KeyGenerator.getInstance("DES");//擷取DES算法key的工廠
System.out.println(_generator);
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); //産生一個加密的随機數,getInstance方法裡還可以指定用哪個公司的算法,SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG","SUN");用sun公司的jdk,我們公司産品是支援ibm的jdk,調試的時候産生的秘鑰一直和eclipse裡測試裡産生的不一樣
System.out.println(secureRandom);
secureRandom.setSeed(keyStr.getBytes()); //使用種子秘鑰可以生成個固定的加密秘鑰.
_generator.init(secureRandom);
key = _generator.generateKey();
System.out.println(key);
_generator = null;
} catch (NoSuchAlgorithmException e) {
System.out.println("key生成失敗");
e.printStackTrace();
return null;
}
byte[] byteMi = null;
byte[] byteMing = null;
String strMi = "";
try {
byteMing = Str.getBytes("utf-8");
System.out.println(byteMing);
byteMi = getEncCode(byteMing, key);
strMi = new String(Base64.encodeBase64URLSafe(byteMi),"UTF-8");//base64URL主要用于連結的加密,将base64編碼後的字元串中"+"替換為"-","/"替換為_"",
} catch (Exception e) {
e.printStackTrace();
System.out.println("3DES加密失敗");
} finally {
byteMi = null;
byteMing = null;
}
return strMi;
}`
/**
* 獲得一次3DES加密後的密文
*
* @param byts
* @return
*/
private static byte[] getEncCode(byte[] byts, Key key) {
byte[] byteFina = null;
Cipher cipher;
try {
cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);//加密模式為CBC
System.out.println(cipher);
byteFina = cipher.doFinal(byts);
} catch (Exception e) {
e.printStackTrace();
} finally {
cipher = null;
}
return byteFina;
}
接下來是解密過程,解密時同樣使用自定義的種子秘鑰生成一個加密的秘鑰,此秘鑰和上面加密過程中産生的秘鑰是一樣的:
/**
* 獲得3DES解密後的明文
*
* @param sign 密文
* @param keyStr 自定義秘鑰
* @return 明文
*/
public static String getDecString(String sign, String keyStr) {
Key key = null;
try {
KeyGenerator _generator = KeyGenerator.getInstance("DES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(keyStr.getBytes());
_generator.init(secureRandom);
key = _generator.generateKey(); //生成加密字元串的秘鑰
_generator = null;
} catch (NoSuchAlgorithmException e) {
System.out.println("key生成失敗");
e.printStackTrace();
return null;
}
byte[] byteMing = null;
byte[] byteMi = null;
String strMing = "";//解密後的明文
try {
byteMi =Base64.decodeBase64(sign); //解密的方法jdk源碼中已經相容了.decodeBase64URLSaf()的方法,有興趣的可以研究研究
byteMing = getDecCode(byteMi, key); //解密操作
strMing = new String(byteMing, "utf-8");
} catch (IOException e) {
e.printStackTrace();
System.out.println("解密失敗");
} finally {
byteMing = null;
byteMi = null;
}
return strMing;
}
/**
* 獲得一次3DES加密後的密文
*
* @param byts
* @return
*/
private static byte[] getEncCode(byte[] byts, Key key) {
byte[] byteFina = null;
Cipher cipher;
try {
cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);//key-->通過key工廠随機産生的解密秘鑰
System.out.println(cipher);
byteFina = cipher.doFinal(byts);
} catch (Exception e) {
e.printStackTrace();
} finally {
cipher = null;
}
return byteFina;
}
最後是調試過程:
public static void main(String[] args) {
try{
String Str = "1|000000109514|D201811191542590446642|20181119|09:20|210.00|交易成功";
String keyStr = "MIIBIjANBgkqhkiG9w0BAQEFAQ8AMaAwQ"; //種子密鑰
String strMi = chkFile.getTripleDES(Str,keyStr);
System.out.println("加密後字元串:"+strMi);
String strMing = chkFile.getDecString(strMi,keyStr);
System.out.println("解密後字元串:"+strMing);
System.out.print("寫入加密内容成功");
}catch(Exception e){
e.printStackTrace();
}
}
第一次寫部落格,還請各位大佬捧個場,多多指教.