寫一個java常用的加密工具類


1.敘述

java security包下有很多加密算法類,我們可以很簡單的調用它們。他們雖然功能很全,但是使用起來步驟有些繁瑣。我在這里封裝來一些常用的加密算法及他們常用的一些方法,來簡化代碼。

工具類結構如下:

調用步驟:

1.Client為調用類,統一調用加密門面對象(EncrypFacade),通過加密門面對象的對應方法,可以選擇構建出對稱加密門面對象(SymmetryFacade)、非對稱加密門面對象(NoSymmetryFacade)、其他加密門面對象(OtherFacade)。

2.對稱加密和非對稱加密需要密鑰,在構建時先生成密鑰,然后再構建對象(HMAC比較特殊,是需要公鑰加密的哈希算法),這些對象構建使用門面對象中的builder結尾的方法。而其他加密算法則直接使用OtherFacade對象的對應方法實現加密解密,OtherFacade會根據具體方法調用具體加密對象的方法,這些加密對象再調各自的Handle。

3.使用builder方法得到加密對象后調用具體方法實現加密解密,這些方法在各自調用的Handler中。

優點:

雖然我們在開發中一般不會用到多種加密算法,但是各個類的成員都做了延時加載,在調用時才會生成實例對象,所以不用擔心類膨脹。相反的,我們更容易拓展它。

2.示例

2.1 Base64的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String base64 = otherFacade.Base64(text);
System.out.println("base64加密后的密文為:"+base64);
String base64Decrypt = otherFacade.Base64Decrypt(base64);
System.out.println("base64解密后的明文為:"+base64Decrypt);

  byte[] data = "123qwe!@#".getBytes();
  System.out.println("data:"+Arrays.toString(data));
  OtherFacade otherFacade = EncrypFacade.getOtherFacade();
  byte[] base64 = otherFacade.Base64(data);
  System.out.println("Base64加密字節數組結果為:"+Arrays.toString(base64));
  byte[] base64Decrypt = otherFacade.Base64Decrypt(base64);
  System.out.println("Base64解密字節數組結果為:"+Arrays.toString(base64Decrypt));

代碼1:

代碼2:

 

 

 2.2 MD5的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String md5 = otherFacade.MD5(text);
System.out.println("md5加密后的密文為:"+md5);

  byte[] data = "123qwe!@#".getBytes();
  System.out.println("data:"+Arrays.toString(data));
  OtherFacade otherFacade = EncrypFacade.getOtherFacade();
  byte[] md5 = otherFacade.MD5(data);
  System.out.println("md5加密字節數組結果為:"+Arrays.toString(md5));

代碼1:

 代碼2:

 

 

 2.3 SHA的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String sha = otherFacade.SHA(text);
System.out.println("SHA加密后的密文為:"+sha);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
byte[] sha = otherFacade.SHA(data);
System.out.println("SHA加密字節數組結果為:"+Arrays.toString(sha));

代碼1:

 代碼2:

 

 2.4 CP的使用

這個加密算法為本人自創的一種算法,它其實就是結合了其他幾種加密的雜合版。

下面這個實例為可解密的CP加密,加密時先使用base64,再用innovate加密,而解密則是先innovate再base64,innovate是我隨便啟動名字,至於這個算法,我找度娘要的。而innovate加密算法我並沒有在門面對象中公開。

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(text);
System.out.println("CP加密后的密文為:"+cp);
String cpDecrypt = otherFacade.CPDecrypt(cp);
System.out.println("CP解密后的明文為:"+cpDecrypt);

結果:

 

 下面這個實例為不可逆加密,它會使用4種算法多重加密,有MD5、Base64、SHA、innovate,通過自定義的內部算法用鹽值來確定這幾種算法的加密順序,也就是說加密的明文相同,鹽值不同也會導致密文不同。

String text = "123qwe!@#";
String salt = "userName";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(salt, text);
System.out.println("CP加密后的密文為:"+cp);

結果:

 

 2.5 HMAC的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println("HMAC生成的key為:"+key.getPublicKey());
String encrypt1 = hmac1.Encrypt(text);
System.out.println("A使用HMAC加密結果為:"+encrypt1);
//模擬A將key傳遞給B
HMAC hmac2 = otherFacade.HMACBuilder(key);
//HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey());//同上
String encrypt2 = hmac2.Encrypt(text);
System.out.println("B使用HMAC加密結果為:"+encrypt2);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println("HMAC生成的key為:"+key.getPublicKey());
byte[] encrypt1 = hmac1.Encrypt(data);
System.out.println("A使用HMAC加密字節數組結果為:"+Arrays.toString(encrypt1));
//模擬A將key傳遞給B
HMAC hmac2 = otherFacade.HMACBuilder(key);
//HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey());//同上
byte[] encrypt2 = hmac2.Encrypt(data);
System.out.println("B使用HMAC加密字節數組結果為:"+Arrays.toString(encrypt2));

 

代碼1:

 

 代碼2:

 

 

 

2.6 AES的使用

String text = "123qwe!@#";
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey(); System.out.println(
"AES生成的key為:"+key.getPublicKey()); String encrypt = aes1.Encrypt(text); System.out.println("A使用AES加密結果為:"+encrypt); //模擬A將key傳遞給B AES aes2 = symmetryFacade.AESBuilder(key); //AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey());//同上 String decrypt = aes2.Decrypt(encrypt); System.out.println("B使用AES解密結果為:"+decrypt);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey();
System.out.println("AES生成的key為:"+key.getPublicKey());
byte[] encrypt = aes1.Encrypt(data);
System.out.println("A使用AES加密結果為:"+Arrays.toString(encrypt));
//模擬A將key傳遞給B
AES aes2 = symmetryFacade.AESBuilder(key);
//AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey());//同上
byte[] decrypt = aes2.Decrypt(encrypt);
System.out.println("B使用AES解密結果為:"+Arrays.toString(decrypt));

代碼1:

 

 代碼2:

 

 2.7 RES的使用

 我們先來了解下數字簽名和非對稱加密過程

1.數字簽名:

數字簽名是筆跡簽名的模擬,用於保證信息傳輸的完整性、發送者身份認證,以及防止交易中抵賴行為等。 

 公鑰簽名體制的基本思路是:

  ①發送者A用自己的私鑰加密信息,從而對文件簽名

  ②將簽名的文件發送給接受者B

  ③B利用A的公鑰(可以從CA機構等渠道獲得)解密文件,從而驗證簽名。

2.非對稱加密過程

 A與B之間要進行加密通信,非對稱加密流程是:

  ①A與B都要產生一對用於加密和解密的加密密鑰和解密密鑰

  ②A生成一對密鑰,將公用密鑰向其他方公開。將公鑰傳送給B,將私鑰自己保管。B將公鑰傳送給A,將私鑰自己保管。

  ③A發送消息給B時,先用B的公鑰對信息進行加密,再將密文發送給B

  ④B收到A發來的消息時,用自己的私鑰解密

  注意:A和B都只能用其專用私鑰加密由其公鑰加密后的任何信息。

String text = "123qwe!@#";
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
//512為公鑰長度,理論上長度越長越難被破解,如果不填參數默認為1024,若小於512則使用默認值
RSA res1 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key2 = res2.getKey();
//交換publicKey
res1.setKey(key2);
res2.setKey(key1);
//res1.setKey(key2.getPublicKey());//同上
//res2.setKey(key1.getPublicKey());//同上
//A先使用B的公鑰加密,然后再使用自己的私鑰加密
String privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(text));
//生成簽名
String sign1 = res1.sign(privateEncrypt);
System.out.println("A的RSA公鑰為:"+key1.getPublicKey());
System.out.println("B的RSA公鑰為:"+key2.getPublicKey());
System.out.println("A的RSA簽名為:"+sign1);
System.out.println("A使用RSA加密數據為:"+privateEncrypt);
//B得到簽名及加密數據
//先驗證簽名,判斷數據是否被改動過
if(res2.verify(privateEncrypt, sign1)){
    //然后解密
    //先用A的公鑰解密,再用B的私鑰解密,順序與加密相反
    String publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
    System.out.println("B使用RSA解密數據為:"+publicDecrypt);
}
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
//512為公鑰長度,理論上長度越長越難被破解,如果不填參數默認為1024,若小於512則使用默認值
RSA res1 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key2 = res2.getKey();
//交換publicKey
res1.setKey(key2);
res2.setKey(key1);
//res1.setKey(key2.getPublicKey());//同上
//res2.setKey(key1.getPublicKey());//同上
//A先使用B的公鑰加密,然后再使用自己的私鑰加密
byte[] privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(data));
//生成簽名
byte[] sign1 = res1.sign(privateEncrypt);
System.out.println("A的RSA公鑰為:"+key1.getPublicKey());
System.out.println("B的RSA公鑰為:"+key2.getPublicKey());
System.out.println("A的RSA簽名為:"+Arrays.toString(sign1));
System.out.println("A使用RSA加密數據為:"+Arrays.toString(privateEncrypt));
//B得到簽名及加密數據
//先驗證簽名,判斷數據是否被改動過
if(res2.verify(privateEncrypt, sign1)){
    //然后解密
    //先用A的公鑰解密,再用B的私鑰解密,順序與加密相反
    byte[] publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
    System.out.println("B使用RSA解密數據為:"+Arrays.toString(publicDecrypt));
}

代碼1:

 

 代碼2:

 

 

下載地址:

https://github.com/chengpu2/java_eclipse1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM