【加密算法】3DES
一、简介
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
二、实现
/// <summary>
/// 3DES加密
/// ECB模式,偏移向量不起作用
/// 当前代码的密钥、偏移向量不可以含有中文
/// 如需跟java、php通用加解密,参数需一致
/// </summary>
public class Des3Helper
{
private static readonly string _Key = "3dSXKs1oBSzbG@t!AIo#D5cx"; //默认密钥长度可为16位或者24位
private static readonly string _Vector = "Q9Fvi$SO"; //默认偏移向量可为8位 /// <summary>
/// 3DES加密
/// 密码:默认
/// 偏移向量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext)
{
return Encrypt(plaintext, _Key, _Vector);
} /// <summary>
/// 3DES加密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:自定义
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="method">输出编码方式</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext, OutputMethod method)
{
return Encrypt(plaintext, _Key, _Vector, method);
} /// <summary>
/// 3DES加密
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="key">密钥,16或者24位</param>
/// <param name="iv">偏移向量,8位</param>
/// <param name="method">输出编码方式</param>
/// <param name="cipher">运算模式</param>
/// <param name="padding">填充模式</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (String.IsNullOrEmpty(plaintext))
{
throw new ArgumentNullException("明文不能为空");
} byte[] byteArray = Encoding.UTF8.GetBytes(plaintext); TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
provider.Key = Encoding.UTF8.GetBytes(key);
provider.IV = Encoding.UTF8.GetBytes(iv);
provider.Mode = cipher;
provider.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream cStream = new CryptoStream(ms, provider.CreateEncryptor(), CryptoStreamMode.Write);
cStream.Write(byteArray, , byteArray.Length);
cStream.FlushFinalBlock(); byte[] result = ms.ToArray();
return EadUtil.Output(result, method);
}
} /// <summary>
/// 3DES解密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 内容格式:Base64
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext)
{
return Decrypt(ciphertext, _Key, _Vector);
} /// <summary>
/// 3DES解密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 内容格式:Base64
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext, OutputMethod method)
{
return Decrypt(ciphertext, _Key, _Vector, method);
} /// <summary>
/// 3DES解密
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 内容格式:Base64
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <param name="cipher"></param>
/// <param name="padding"></param>
/// <returns></returns>
public static string Decrypt(string ciphertext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (String.IsNullOrEmpty(ciphertext))
{
throw new ArgumentNullException("密文不能为空");
} byte[] buffer = EadUtil.Input(ciphertext, method); TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
provider.Key = Encoding.UTF8.GetBytes(key);
provider.IV = Encoding.UTF8.GetBytes(iv);
provider.Mode = cipher;
provider.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream cStream = new CryptoStream(ms, provider.CreateDecryptor(), CryptoStreamMode.Write);
cStream.Write(buffer, , buffer.Length);
cStream.FlushFinalBlock();
ms.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
【加密算法】3DES的更多相关文章
- DES、3DES、AES、PBE对称加密算法实现及应用
1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...
- java加密算法入门(二)-对称加密详解
1.简单介绍 什么是对称加密算法? 对称加密算法即,加密和解密使用相同密钥的算法. 优缺点: 优点:算法公开.计算量小.加密速度快.加密效率高. 缺点: (1)交易双方都使用同样钥匙,安全性得不到保证 ...
- 对称加密算法在C#中的踩坑日常
前言 有幸接触了一下传说中的对称加密算法3DES 感觉这些加密算法与我的工作是想去甚远的,一般没什么机会接触这些东西 今次了解了一下3DES这个对称算法 原理算不上明白,算是踩了C#中的一些坑吧 C# ...
- IPSec VPN实验
IPSec VPN实验 实验拓扑: 实验目的:掌握IPSec VPN原理 掌握site-to-site VPN配置 IPSec配置参数: IKE policy isakmp key 转换集 加密算法 ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是r ...
- java基础/数据加解密(Mooc)
一.消息摘要算法 常用摘要算法: 以下 (HEX)内容:bc指Bouncy Castle | cc指:Apache commons Codec 1.消息摘要算法MD5及MD族(MD2,MD4) 消 ...
- IPsec分析/测试/
一 局域网拓扑图 局域网环境搭建步骤: (升级最新版本 ,恢复出厂设置后) 1 两台网关wan口直连,分别接两台pc , 2 局域网网络测试,正常情况下PC1 和PC2 互通 ,测试通过在进行ip ...
- JAVA实现对称加密
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.对称加密算法DES 1.概述:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这 ...
- Golang 加密方法
如果想直接使用我下列的库 可以直接go get 我的github go get -u github.com/hybpjx/InverseAlgorithm md5 加密--不可逆 MD5信息摘要算法是 ...
- [转] 对称加密算法DES、3DES
转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...
随机推荐
- RMQ(或运算)
RMQ https://ac.nowcoder.com/acm/contest/283/J 题目描述 按位或运算:处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1.例如5 ...
- 【校招面试 之 C/C++】第5题 C++各种构造函数的写法
构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ...
- 复杂度分析 quick sort&merge sort
空间复杂度看新开了什么数据结构就够了 公式=几个点*每个点执行了多少次 二叉树都是n次 二分法查找:lgn 全部查找:n n:找一个数,但是两边都要找.相当于遍历.类似于rotated sorted ...
- 215. Kth Largest Element in an Array(QuickSort)
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 27-x的y次方的后三位数
题目内容: 输入描述 数据分n组,对于每组数据有两个正整数x和y(x的y次方必须大于100) 输出描述 对于每组输出,输出一个值,即x的y次方结果的最后三位数 提示:13的13次方为:30287510 ...
- jquery源码学习-初始(1)
最近几天一直在研究jquery源码,由于水平太低看得昏头转向.本来理解的也不是很深刻,下面就用自己的想法来说下jquery是如何定义构造函数初始化的.如果有什么不对的地方,希望个位高手指出. 首先要了 ...
- Linq和EF 做 单一条件查询 和 复合条件 查询 以及 多表 联合查询 示例
单一条件查询: var table2Object = (from t1 in db.table1 join t2 in db.table2 on t1.id equals t2.id select t ...
- PAT 1084 外观数列(20)(代码+思路+推荐测试用例)
1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...
- pip安装python模块方法
网上搜索了很多,主流的配置方法分为两种: 摘自 1.http://www.jb51.net/article/83617.htm 安装pip的包并确定pip安装时的镜像源地址,国内常用的地址有: htt ...
- Debian 采用 iso 镜像作为 apt 源
1.将N个debian-506-amd64-DVD-N.iso存放于本地或其他媒介内,本例是放在本机/iso/目录下2.创建N个挂载点目录 如下: debian:~#mkdir –r /media/d ...