C# 3Des加密解密
第三方的加密规则约定:加密经过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
}
}
最新文章
- 深入理解javascript(一)
- 《Linux内核设计的艺术》学习笔记(一)从开机加电到加载三个汇编源码
- 利用FluorineFx的ByteArray上传图片
- Android Translate 动画跳跃和缓慢移动
- 1、API
- java多线程之守护线程以及Join方法
- WinSCP怎么导入filezilla中的站点?
- C#基础(203)实例方法和重载方法总结,构造方法与实例方法总结,this关键字
- zookeeper集群扩容/下线节点实践
- 个人前端学习路线图与github优秀前端开发者的路线图推荐
- base_基础
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
- LinkServer--在Job中使用Linkserver注意事项
- 逻辑回归--美国挑战者号飞船事故_同盾分数与多头借贷Python建模实战
- Linux对文件归档和压缩(学习笔记八)
- 替换python字典中的key值
- DBUnit使用介绍
- CodeChef DGCD
- 第五篇 Flask组件之SQLAchemy及Flask-SQLAlchemy插件/Flask-Script/Flask-migrate/pipreqs模块
- DFS - 深度搜索 - 基于邻接列表表示法
热门文章
- Elasticsearch:fuzzy 搜索 (模糊搜索)
- C++ 头文件的理解
- PHP mysqli_get_client_stats() 函数
- 之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
- C++中时间转换
- 【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路
- 转载像元素周期表一样的html5的标签图集
- Python3 Address already in use 解决方法
- 关于centos6版本执行程序报错:libc.so.6: version GLIBC_2.14 not found的解决
- 图论——Floyd算法拓展及其动规本质