Java通用BouncyCastle实现的DES3加密的方法

 更新时间:2020年12月28日 10:33:00   作者:张占岭 lind  
这篇文章主要介绍了Java通用BouncyCastle实现的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加密
  /// https://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加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 两个小例子轻松搞懂 java 中递归与尾递归的优化操作

    两个小例子轻松搞懂 java 中递归与尾递归的优化操作

    这篇文章主要介绍了两个小例子轻松搞懂 java 中递归与尾递归的优化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • mybatis mapper.xml 注释带参数的坑及解决

    mybatis mapper.xml 注释带参数的坑及解决

    这篇文章主要介绍了mybatis mapper.xml 注释带参数的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 解决Spring中@Value注解取值为null问题

    解决Spring中@Value注解取值为null问题

    近期应用中因业务迭代需要接入 user 客户端,接入后总是启动失败,报注册 user bean 依赖的配置属性为 null,所以接下来小编就和大家一起排查分析这个问题,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • logback 自定义Pattern模板教程

    logback 自定义Pattern模板教程

    这篇文章主要介绍了logback 自定义Pattern模板教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 使用Java完成Socket文件传输方式

    使用Java完成Socket文件传输方式

    这篇文章主要介绍了使用Java完成Socket文件传输方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java多线程教程之如何利用Future实现携带结果的任务

    Java多线程教程之如何利用Future实现携带结果的任务

    Callable与Future两功能是Java 5版本中加入的,这篇文章主要给大家介绍了关于Java多线程教程之如何利用Future实现携带结果任务的相关资料,需要的朋友可以参考下
    2021-12-12
  • 详解Java如何给按钮添加监视器

    详解Java如何给按钮添加监视器

    这篇文章主要介绍了详解Java如何给按钮添加监视器,使用匿名对象、实现接口、实现类、Lambda表达式、注解等,需要的朋友可以参考下
    2023-04-04
  • Mybatis示例讲解注解开发中的单表操作

    Mybatis示例讲解注解开发中的单表操作

    这篇文章主要介绍了使用Mybatis对数据库进行单表操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java 实现websocket的两种方式实例详解

    java 实现websocket的两种方式实例详解

    这篇文章主要介绍了java 实现websocket的两种方式实例详解,一种使用tomcat的websocket实现,一种使用spring的websocket,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • 基于Java实现图片相似度对比的示例代码

    基于Java实现图片相似度对比的示例代码

    很多时候我们需要将两个图片进行对比,确定两个图片的相似度。本文将利用Java和OpenCV库实现图片相似度对比,感兴趣的可以动手尝试一下
    2022-07-07

最新评论