Java通用BouncyCastle實(shí)現(xiàn)的DES3加密的方法
對(duì)于BouncyCastle類庫(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類比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)文章
兩個(gè)小例子輕松搞懂 java 中遞歸與尾遞歸的優(yōu)化操作
這篇文章主要介紹了兩個(gè)小例子輕松搞懂 java 中遞歸與尾遞歸的優(yōu)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
mybatis?mapper.xml?注釋帶參數(shù)的坑及解決
這篇文章主要介紹了mybatis?mapper.xml?注釋帶參數(shù)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
解決Spring中@Value注解取值為null問(wèn)題
近期應(yīng)用中因業(yè)務(wù)迭代需要接入 user 客戶端,接入后總是啟動(dòng)失敗,報(bào)注冊(cè) user bean 依賴的配置屬性為 null,所以接下來(lái)小編就和大家一起排查分析這個(gè)問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08
Java多線程教程之如何利用Future實(shí)現(xiàn)攜帶結(jié)果的任務(wù)
Callable與Future兩功能是Java?5版本中加入的,這篇文章主要給大家介紹了關(guān)于Java多線程教程之如何利用Future實(shí)現(xiàn)攜帶結(jié)果任務(wù)的相關(guān)資料,需要的朋友可以參考下2021-12-12
Mybatis示例講解注解開(kāi)發(fā)中的單表操作
這篇文章主要介紹了使用Mybatis對(duì)數(shù)據(jù)庫(kù)進(jìn)行單表操作的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
java 實(shí)現(xiàn)websocket的兩種方式實(shí)例詳解
這篇文章主要介紹了java 實(shí)現(xiàn)websocket的兩種方式實(shí)例詳解,一種使用tomcat的websocket實(shí)現(xiàn),一種使用spring的websocket,本文通過(guò)代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
基于Java實(shí)現(xiàn)圖片相似度對(duì)比的示例代碼
很多時(shí)候我們需要將兩個(gè)圖片進(jìn)行對(duì)比,確定兩個(gè)圖片的相似度。本文將利用Java和OpenCV庫(kù)實(shí)現(xiàn)圖片相似度對(duì)比,感興趣的可以動(dòng)手嘗試一下2022-07-07

