对于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"));

结果

基础才是重中之重~BouncyCastle实现的DES3加密~java通用的更多相关文章

  1. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  2. 基础才是重中之重~关于ThreadStatic和Quartz的一点渊源

    回到目录 ThreadStatic ThreadStatic是C#里的一个特性,它可以让你的字段在一个线程里有效,但你不能控制这个字段在何时被回收,即如果声明一个int32的字段为ThreadStat ...

  3. 基础才是重中之重~方法override详解

    回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写 ...

  4. 基础才是重中之重~ConcurrentDictionary让你的多线程代码更优美

    回到目录 ConcurrentDictionary是.net4.0推出的一套线程安全集合里的其中一个,和它一起被发行的还有ConcurrentStack,ConcurrentQueue等类型,它们的单 ...

  5. 基础才是重中之重~stream和byte[]的概念与转化

    回到目录 多看几篇 之所以写这篇文章完全是因为最近在研究FastDFS这个分布式的文件存储系统,当然这不是我第一次研究它了,就像我们去看一本书,我们不会只看一篇,而是一次次,一篇篇,每看一次会有新的收 ...

  6. 基础才是重中之重~理解linq中的groupby

    linq将大部分SQL语句进行了封装,这使得它们更加面向对象了,对于开发者来说,这是一件好事,下面我从基础层面来说一下GroupBy在LINQ中的使用. 对GroupBy的多字段分组,可以看我的这篇文 ...

  7. 基础才是重中之重~lock和monitor的区别

    回到目录 Monitor的介绍 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中 ...

  8. C# 基础才是重中之重~对象的生与死

    为何要写 之所以写这篇文章,完全是因为学生们在实际开发中遇到的问题,一个对象占用的内存空间总不被释放,导致系统内存不断攀升,其最主要原因是我们对“对象的生与死”不清楚,或者从来没有认真去考虑过这件事, ...

  9. 基础才是重中之重~Emit动态构建方法(参数和返回值)

    回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...

随机推荐

  1. CoProcessFunction实战三部曲之一:基本功能

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. python - os.sep用法

    python是跨平台的.在Windows上,文件的路径分隔符是'\',在Linux上是'/'.为了让代码在不同的平台上都能运行,那么路径应该写'\'还是'/'呢?使用os.sep的话,就不用考虑这个了 ...

  3. (十八)面向流水线的设计:CPU的一心多用

    一.单指令周期       由前可知,一条CPU指令的执行有三个步骤:指令读取.指令译码.指令执行.由于这个过程受CPU时钟的控制,如果我们将这个过程安排在一个CPU时钟周期内执行,这种设计思路就叫单 ...

  4. moviepy音视频开发:audio_normalize调整剪辑音量大小到正常

    ☞ ░ 前往老猿Python博文目录 ░ 概述 audio_normalize函数用于将一个剪辑的音量大小调整到正常,调整的思路就是将剪辑中音频帧数据的最大值取出来,当其值小于1时,表示剪辑的音量偏小 ...

  5. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  6. Python中可迭代对象是什么?

    Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问. __i ...

  7. 关于Python中中文文本文件使用二进制方式读取后的解码UnicodeDecodeError问题

    最近老猿在进行文件操作的验证测试,发现对于中文文本文件如果使用二进制方式打开,返回的类型是bytes,如果要转换成可读的字符串信息需要进行解码.可是老猿使用decode()或decode(" ...

  8. PyQt(Python+Qt)学习随笔:布局控件layout的layoutSizeConstraint属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

  9. 谈谈传说中的redo log是什么?有啥用?

    目录 一.引出 redo log 的作用 二.思考一个问题: 三.redo log block 四.redo log buffer 五.redo log的刷盘时机 六.推荐参数 七.redo log ...

  10. [GKCTF2020]cve版签到

    cve-2020-7066漏洞 利用get_header($url)函数漏洞%00对部分url截断 构造ssrf请求,用127.0.0.1网址访问目标主机内部资源 其实就是get_header()的C ...