一、简介

DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。

DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。该算法把64位密码中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,在计算密钥时要忽略这8位.如果输入的密码只是在这8位上有区别的话,那么操作后的结果将是一样的.

二、实现

/// <summary>
/// DES加密解密类
/// ECB模式,偏移向量不起作用
/// 当前代码的密钥、偏移向量不可以含有中文
/// 如需跟java、php通用加解密,参数需一致
/// </summary>
public class DesHelper
{
private static readonly string _Key = "!@#Swg68"; //默认密钥 长度需8位
private static readonly string _Vector = "vb13$@FG"; //默认偏移向量 长度需8位 /// <summary>
/// DES加密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext)
{
return Encrypt(plaintext, _Key, _Vector);
} /// <summary>
/// DES加密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:自定义
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext, OutputMethod method)
{
return Encrypt(plaintext, _Key, _Vector, method);
} /// <summary>
/// DES加密
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="key">密码,8位,不含中文</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("明文不能为空");
} Encoding encoding = Encoding.UTF8;
byte[] byteContent = encoding.GetBytes(plaintext);
byte[] byteKey = encoding.GetBytes(key);
byte[] byteIV = encoding.GetBytes(iv); DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Key = byteKey;
provider.IV = byteIV;
provider.Mode = cipher;
provider.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream cStream = new CryptoStream(ms, provider.CreateEncryptor(), CryptoStreamMode.Write);
cStream.Write(byteContent, , byteContent.Length);
cStream.FlushFinalBlock(); byte[] result = ms.ToArray();
return EadUtil.Output(result, method);
}
} /// <summary>
/// DES解密 输出编码必须跟加密的输出编码一致
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext)
{
return Decrypt(ciphertext, _Key, _Vector);
} /// <summary>
/// DES解密 输出编码必须跟加密的输出编码一致
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext, OutputMethod method)
{
return Decrypt(ciphertext, _Key, _Vector, method);
} /// <summary>
/// DES解密 输出编码必须跟加密的输出编码一致
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <param name="key">密码,8位,不含中文</param>
/// <param name="iv">偏移量,8位,不含中文</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); Encoding encoding = Encoding.UTF8;
byte[] byteKey = encoding.GetBytes(key);
byte[] byteIV = encoding.GetBytes(iv); DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Key = byteKey;
provider.IV = byteIV;
provider.Mode = cipher;
provider.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream stream2 = new CryptoStream(ms, provider.CreateDecryptor(), CryptoStreamMode.Write);
stream2.Write(buffer, , buffer.Length);
stream2.FlushFinalBlock();
ms.Close();
return encoding.GetString(ms.ToArray());
}
}
}

点击查看 OutputMethod、EadUtil

【加密算法】DES的更多相关文章

  1. [转] 对称加密算法DES、3DES

    转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...

  2. 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  3. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。

    对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...

  4. 对称加密算法 ~ Des

    一.对称加密 (Symmetric Key Encryption)  对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...

  5. Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密

    Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...

  6. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

    Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...

  7. 对称加密算法DES、3DES和AES 原理总结(转载)

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  8. 加密算法 DES 3DES RSA AES 简介

    数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...

  9. java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

    概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...

  10. 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用(转载)

    加密技术通常分为两大类:"对称式"和"非对称式". 对称性加密算法:对称式加密就是加密和解密使用同一个密钥.信息接收双方都需事先知道密匙和加解密算法且其密匙是相 ...

随机推荐

  1. luoguP3367 [模板]并查集

    题目链接:https://www.luogu.org/problemnew/show/P3367 思路: 今天学了新算法——并查集,本题是简单的并查集题的模板. 核心思想是“递归+压缩路径”. 并查集 ...

  2. np.random.random()系列函数

    1.np.random.random()函数参数 np.random.random((1000, 20)) 上面这个就代表生成1000行 20列的浮点数,浮点数都是从0-1中随机. 2.numpy.r ...

  3. Spring配置连接池

    ---------------------siwuxie095                                 Spring 配置连接池         1.Spring 配置内置连接 ...

  4. php ZeroMQ 的使用

    一.ZeroMQ简介 ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 Socket Library,他使得 Socket 编程更加简单.简洁和性能更高.是一个消息 ...

  5. php Pthread 多线程 (五) 线程同步

    有些时候我们不希望线程调用start()后就立刻执行,在处理完我们的业务逻辑后在需要的时候让线程执行. <?php class Sync extends Thread { private $na ...

  6. Golang之时间、日期类型

    孤身只影的一直小地鼠,艰难的走在路上 package main import ( "fmt" "time" ) //获取时间的格式 func testTime( ...

  7. @RequestMapping 介绍

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她 ...

  8. c++中类的静态成员对象

    在c++中,可以声明一个静态的成员对象,但是此时仅仅声明,没有定义,也不会创建这个内部的静态成员对象.只有在类体外部定以后才能创建这个对象. #include<iostream> usin ...

  9. Dice 7 ==> dice 5

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  10. 2018.10.19 bzoj1584: Cleaning Up 打扫卫生(线性dp)

    传送门 dp妙题. 考虑到每个位置分一组才花费nnn的贡献. 因此某一段不同的数的个数不能超过sqrt(n)sqrt(n)sqrt(n),于是对于当前的位置iii我们记pos[j]pos[j]pos[ ...