Java通用BouncyCastle實(shí)現(xiàn)的DES3加密的方法
對(duì)于BouncyCastle類(lèi)庫(kù)(包)來(lái)說(shuō),他提供了很多加密算法,在與.net和java進(jìn)行相互加解密過(guò)程中,得到了不錯(cuò)的應(yīng)用,本文以DES3為例,來(lái)說(shuō)一下DES3加解密的過(guò)程。
加密過(guò)程
- 明文字符轉(zhuǎn)為byte數(shù)組
- 對(duì)密鑰進(jìn)行處理,處理后一般為16或者24字節(jié)
- 對(duì)明文進(jìn)行DES3加密,生成密文的byte數(shù)組
- 對(duì)密文byte數(shù)組進(jìn)行base64的編碼
解密過(guò)程
- 對(duì)密文byte數(shù)組進(jìn)行base64的解碼
- 對(duì)密鑰進(jìn)行處理,處理后一般為16或者24字節(jié)
- 對(duì)解碼后的byte數(shù)組進(jìn)行DES3解密
- 對(duì)解密之后的byte數(shù)組進(jìn)行Encoding.UTF8.GetString方法的調(diào)用生成明文字符串
原碼
/// <summary> /// DES3加密 /// https://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/ /// </summary> public class BouncyCastleHelper { static IBlockCipher engine = new DesEngine(); /// <summary> /// 生成一個(gè)16位的key. /// </summary> /// <returns></returns> public string GenerateDES3Key() { CipherKeyGenerator cipherKeyGenerator = new CipherKeyGenerator(); cipherKeyGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 192)); //192 specifies the size of key in bits i.e 24 bytes var keyDES3 = cipherKeyGenerator.GenerateKey(); BigInteger bigInteger = new BigInteger(keyDES3); return bigInteger.ToString(16); } /// <summary> /// 做一個(gè)16位的md5加密,防止被其它人解析. /// </summary> /// <param name="Source"></param> /// <returns></returns> static byte[] GetMd5Digest(string Source) { var msgBytes = Encoding.UTF8.GetBytes(Source); var md5Digest = new MD5Digest(); md5Digest.BlockUpdate(msgBytes, 0, msgBytes.Length); byte[] result = new byte[md5Digest.GetDigestSize()]; md5Digest.DoFinal(result, 0); return result; } /// <summary> /// 使用DES3加密 /// </summary> /// <param name="plainText">需要加密的字符串</param> /// <param name="keys">加密字符串的密鑰</param> /// <returns>加密后的字符串</returns> public static string Encrypt(string plainText, string keys) { byte[] ptBytes = Encoding.UTF8.GetBytes(plainText); byte[] rv = Encrypt(ptBytes, keys); // 密文轉(zhuǎn)為base64字符串 return Convert.ToBase64String(rv); } static byte[] Encrypt(byte[] ptBytes, string keys) { byte[] key = GetMd5Digest(keys); BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine()); cipher.Init(true, new KeyParameter(key)); byte[] rv = new byte[cipher.GetOutputSize(ptBytes.Length)]; int tam = cipher.ProcessBytes(ptBytes, 0, ptBytes.Length, rv, 0); cipher.DoFinal(rv, tam); return rv; } /// <summary> /// 使用DES3解密 /// </summary> /// <param name="cipherText">需要加密的字符串</param> /// <param name="keys">加密字符串的密鑰</param> /// <returns>解密后的字符串</returns> public static string Decrypt(string cipherText, string keys) { // 把密文進(jìn)行base64的解碼 byte[] base64StringBytes = Convert.FromBase64String(cipherText); var rv = Decrypt(base64StringBytes, keys); // 字符數(shù)組轉(zhuǎn)為明文字符串 return Encoding.UTF8.GetString(rv, 0, rv.Length); } static byte[] Decrypt(byte[] cipherText, string keys) { byte[] key = GetMd5Digest(keys); BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DesEdeEngine()); cipher.Init(false, new KeyParameter(key)); byte[] comparisonBytes = new byte[cipher.GetOutputSize(cipherText.Length)]; int length = cipher.ProcessBytes(cipherText, comparisonBytes, 0); cipher.DoFinal(comparisonBytes, length); //Do the final block return comparisonBytes; } }
調(diào)用
string result = BouncyCastleHelper.Encrypt("hello", "abc123"); Console.WriteLine("hello=" + result); Console.WriteLine("plainText=" + BouncyCastleHelper.Decrypt(result, "abc123"));
結(jié)果
到此這篇關(guān)于Java通用BouncyCastle實(shí)現(xiàn)的DES3加密的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)DES3加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java類(lèi)比C++的STL庫(kù)詳解
- Java使用BouncyCastle加密
- java:程序包org.bouncycastle.jce.provider不存在問(wèn)題及解決
- Java的JSTL標(biāo)簽庫(kù)詳解
- 詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)
- JavaWeb開(kāi)發(fā)之JSTL標(biāo)簽庫(kù)的使用、 自定義EL函數(shù)、自定義標(biāo)簽(帶屬性的、帶標(biāo)簽體的)
- 在JSTL EL中處理java.util.Map,及嵌套List的情況
- Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()
相關(guān)文章
Java實(shí)現(xiàn)用位運(yùn)算維護(hù)狀態(tài)碼
位運(yùn)算是一種非常高效的運(yùn)算方式,在算法考察中比較常見(jiàn),那么業(yè)務(wù)代碼中我們?nèi)绾问褂梦贿\(yùn)算呢,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2024-03-03MyBatis中動(dòng)態(tài)SQL語(yǔ)句@Provider的用法
本文主要介紹了MyBatis中動(dòng)態(tài)SQL語(yǔ)句@Provider的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06java數(shù)據(jù)結(jié)構(gòu)與算法之奇偶排序算法完整示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之奇偶排序算法,較為詳細(xì)的分析了奇偶算法的原理并結(jié)合完整示例形式給出了實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式
本文主要介紹Struts2的DMI動(dòng)態(tài)調(diào)用的兩種方式,簡(jiǎn)單實(shí)用,希望能給大家做一個(gè)參考。2016-06-06JavaWeb 實(shí)現(xiàn)多個(gè)文件壓縮下載功能
文件下載時(shí),我們可能需要一次下載多個(gè)文件,批量下載文件時(shí),需要將多個(gè)文件打包為zip,然后再下載。本文給大家分享實(shí)現(xiàn)思路及具體實(shí)現(xiàn)代碼,對(duì)javaweb實(shí)現(xiàn)文件壓縮下載功能感興趣的朋友一起學(xué)習(xí)吧2017-07-07使用vue3.x+vite+element-ui+vue-router+vuex+axios搭建項(xiàng)目
因?yàn)関ue3出了一段時(shí)間了,element也出了基于vue3.x版本的element-plus,這篇文章就拿他們搭建一個(gè)項(xiàng)目,希望能給你帶來(lái)幫助2021-08-08MySQL text類(lèi)型對(duì)應(yīng)mybatis jdbcType類(lèi)型方式
這篇文章主要介紹了MySQL text類(lèi)型對(duì)應(yīng)mybatis jdbcType類(lèi)型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot跨域問(wèn)題的解決方法實(shí)例
這篇文章主要給大家介紹了關(guān)于SpringBoot跨域問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05使用SpringMVC響應(yīng)json格式返回的結(jié)果類(lèi)型
這篇文章主要介紹了使用SpringMVC響應(yīng)json格式返回的結(jié)果類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07