如何使用BouncyCastle库在Java中实现DES3加密算法?

2026-04-30 04:102阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计898个文字,预计阅读时间需要4分钟。

如何使用BouncyCastle库在Java中实现DES3加密算法?

BouncyCastle库提供了多种加密算法,支持.net和Java之间的互操作。以DES3为例,以下是DES3加密和解密的过程:

加密过程

1.生成密钥:选择一个合适的密钥,例如:`1234567890123456`。

2.初始化加密器:使用DES3算法和生成的密钥初始化加密器。

3.加密数据:将需要加密的明文数据转换为字节数组,然后使用加密器进行加密。

java

import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.security.Security;

Security.addProvider(new BouncyCastleProvider());

KeyGenerator keyGenerator=KeyGenerator.getInstance(DESede, BC);keyGenerator.init(168);SecretKey secretKey=keyGenerator.generateKey();

Cipher cipher=Cipher.getInstance(DESede/ECB/PKCS5Padding, BC);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted=cipher.doFinal(Hello, BouncyCastle!.getBytes());

解密过程

1.使用相同的密钥:使用与加密相同的密钥。

2.初始化解密器:使用相同的算法和密钥初始化解密器。

3.解密数据:使用解密器对加密后的数据进行解密。

java

cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decrypted=cipher.doFinal(encrypted);String originalText=new String(decrypted);

这样,我们就完成了DES3的加密和解密过程。

对于BouncyCastle类库(包)来说,他提供了很多加密算法,在与.net和java进行相互加解密过程中,得到了不错的应用,本文以DES3为例,来说一下DES3加解密的过程。

加密过程

  • 明文字符转为byte数组
  • 对密钥进行处理,处理后一般为16或者24字节
  • 对明文进行DES3加密,生成密文的byte数组
  • 对密文byte数组进行base64的编码

解密过程

  • 对密文byte数组进行base64的解码
  • 对密钥进行处理,处理后一般为16或者24字节
  • 对解码后的byte数组进行DES3解密
  • 对解密之后的byte数组进行Encoding.UTF8.GetString方法的调用生成明文字符串

原码

/// <summary> /// DES3加密 /// www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/ /// </summary> public class BouncyCastleHelper { static IBlockCipher engine = new DesEngine(); /// <summary> /// 生成一个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> /// 做一个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); // 密文转为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) { // 把密文进行base64的解码 byte[] base64StringBytes = Convert.FromBase64String(cipherText); var rv = Decrypt(base64StringBytes, keys); // 字符数组转为明文字符串 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; } }

调用

string result = BouncyCastleHelper.Encrypt("hello", "abc123"); Console.WriteLine("hello=" + result); Console.WriteLine("plainText=" + BouncyCastleHelper.Decrypt(result, "abc123"));

结果

到此这篇关于Java通用BouncyCastle实现的DES3加密的文章就介绍到这了,更多相关java实现DES3加密内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

如何使用BouncyCastle库在Java中实现DES3加密算法?

标签:DES3

本文共计898个文字,预计阅读时间需要4分钟。

如何使用BouncyCastle库在Java中实现DES3加密算法?

BouncyCastle库提供了多种加密算法,支持.net和Java之间的互操作。以DES3为例,以下是DES3加密和解密的过程:

加密过程

1.生成密钥:选择一个合适的密钥,例如:`1234567890123456`。

2.初始化加密器:使用DES3算法和生成的密钥初始化加密器。

3.加密数据:将需要加密的明文数据转换为字节数组,然后使用加密器进行加密。

java

import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.security.Security;

Security.addProvider(new BouncyCastleProvider());

KeyGenerator keyGenerator=KeyGenerator.getInstance(DESede, BC);keyGenerator.init(168);SecretKey secretKey=keyGenerator.generateKey();

Cipher cipher=Cipher.getInstance(DESede/ECB/PKCS5Padding, BC);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted=cipher.doFinal(Hello, BouncyCastle!.getBytes());

解密过程

1.使用相同的密钥:使用与加密相同的密钥。

2.初始化解密器:使用相同的算法和密钥初始化解密器。

3.解密数据:使用解密器对加密后的数据进行解密。

java

cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decrypted=cipher.doFinal(encrypted);String originalText=new String(decrypted);

这样,我们就完成了DES3的加密和解密过程。

对于BouncyCastle类库(包)来说,他提供了很多加密算法,在与.net和java进行相互加解密过程中,得到了不错的应用,本文以DES3为例,来说一下DES3加解密的过程。

加密过程

  • 明文字符转为byte数组
  • 对密钥进行处理,处理后一般为16或者24字节
  • 对明文进行DES3加密,生成密文的byte数组
  • 对密文byte数组进行base64的编码

解密过程

  • 对密文byte数组进行base64的解码
  • 对密钥进行处理,处理后一般为16或者24字节
  • 对解码后的byte数组进行DES3解密
  • 对解密之后的byte数组进行Encoding.UTF8.GetString方法的调用生成明文字符串

原码

/// <summary> /// DES3加密 /// www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/ /// </summary> public class BouncyCastleHelper { static IBlockCipher engine = new DesEngine(); /// <summary> /// 生成一个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> /// 做一个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); // 密文转为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) { // 把密文进行base64的解码 byte[] base64StringBytes = Convert.FromBase64String(cipherText); var rv = Decrypt(base64StringBytes, keys); // 字符数组转为明文字符串 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; } }

调用

string result = BouncyCastleHelper.Encrypt("hello", "abc123"); Console.WriteLine("hello=" + result); Console.WriteLine("plainText=" + BouncyCastleHelper.Decrypt(result, "abc123"));

结果

到此这篇关于Java通用BouncyCastle实现的DES3加密的文章就介绍到这了,更多相关java实现DES3加密内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

如何使用BouncyCastle库在Java中实现DES3加密算法?

标签:DES3