第三方的加密规则约定:加密经过3DES加密后的Base64 编码

最近在对接一个第三方接口,请求参数和响应参数全采用3des加密规则,由于我是用.NET对接的,而第三方是Java开发的,所以两种程序之间采用的算法有一点差异,java的3des加密采用的是"DESede/CBC/PKCS5Padding"规则,所以对应的C#规则是"PaddingMode.PKCS7和CipherMode.CBC",使用CBC模式的话在C#下必须传入加密向量IV(固定长度8位),默认"12345678",加密密钥和IV双方约定好即可,如果是ECB编码模式,那么就无须使用加密向量。

C#代码如下:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace TCWireless.Utility

{

public class DESHelper
{
  #region 3des加密

/// <summary>
/// 3des ecb模式加密
/// </summary>
/// <param name="aStrString">待加密的字符串</param>
/// <param name="aStrKey">密钥</param>
/// <param name="iv">加密矢量:只有在CBC解密模式下才适用</param>
/// <param name="mode">运算模式</param>
/// <returns>加密后的字符串</returns>
public static string Encrypt3Des(string aStrString, string aStrKey, CipherMode mode = CipherMode.ECB, string iv = "12345678")
{
  try
  {
    var des = new TripleDESCryptoServiceProvider
    {
      Key = Encoding.UTF8.GetBytes(aStrKey),
      Mode = mode
    };
    if (mode == CipherMode.CBC)
    {
      des.IV = Encoding.UTF8.GetBytes(iv);
    }
    var desEncrypt = des.CreateEncryptor();
    byte[] buffer = Encoding.UTF8.GetBytes(aStrString);
    return Convert.ToBase64String(desEncrypt.TransformFinalBlock(buffer, 0, buffer.Length));
  }
  catch (Exception e)
  {
    return string.Empty;
  }
}

#endregion

#region 3des解密

/// <summary>
/// des 解密
/// </summary>
/// <param name="aStrString">加密的字符串</param>
/// <param name="aStrKey">密钥</param>
/// <param name="iv">解密矢量:只有在CBC解密模式下才适用</param>
/// <param name="mode">运算模式</param>
/// <returns>解密的字符串</returns>
public static string Decrypt3Des(string aStrString, string aStrKey, CipherMode mode = CipherMode.ECB, string iv = "12345678")
{
  try
  {
    var des = new TripleDESCryptoServiceProvider
    {
      Key = Encoding.UTF8.GetBytes(aStrKey),
      Mode = mode,
      Padding = PaddingMode.PKCS7
    };
    if (mode == CipherMode.CBC)
    {
      des.IV = Encoding.UTF8.GetBytes(iv);
    }
    var desDecrypt = des.CreateDecryptor();
    var result = "";
    byte[] buffer = Convert.FromBase64String(aStrString);
    result = Encoding.UTF8.GetString(desDecrypt.TransformFinalBlock(buffer, 0, buffer.Length));
    return result;
  }
  catch (Exception e)
  {
    return string.Empty;
  }
}
#endregion

  }
}

最新文章

  1. 深入理解javascript(一)
  2. 《Linux内核设计的艺术》学习笔记(一)从开机加电到加载三个汇编源码
  3. 利用FluorineFx的ByteArray上传图片
  4. Android Translate 动画跳跃和缓慢移动
  5. 1、API
  6. java多线程之守护线程以及Join方法
  7. WinSCP怎么导入filezilla中的站点?
  8. C#基础(203)实例方法和重载方法总结,构造方法与实例方法总结,this关键字
  9. zookeeper集群扩容/下线节点实践
  10. 个人前端学习路线图与github优秀前端开发者的路线图推荐
  11. base_基础
  12. 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
  13. LinkServer--在Job中使用Linkserver注意事项
  14. 逻辑回归--美国挑战者号飞船事故_同盾分数与多头借贷Python建模实战
  15. Linux对文件归档和压缩(学习笔记八)
  16. 替换python字典中的key值
  17. DBUnit使用介绍
  18. CodeChef DGCD
  19. 第五篇 Flask组件之SQLAchemy及Flask-SQLAlchemy插件/Flask-Script/Flask-migrate/pipreqs模块
  20. DFS - 深度搜索 - 基于邻接列表表示法

热门文章

  1. Elasticsearch:fuzzy 搜索 (模糊搜索)
  2. C++ 头文件的理解
  3. PHP mysqli_get_client_stats() 函数
  4. 之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
  5. C++中时间转换
  6. 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路
  7. 转载像元素周期表一样的html5的标签图集
  8. Python3 Address already in use 解决方法
  9. 关于centos6版本执行程序报错:libc.so.6: version GLIBC_2.14 not found的解决
  10. 图论——Floyd算法拓展及其动规本质