数据加密标准(DES)的C#实现(2)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: /**//* * 数据加密标准(DES)的C#实现(2) *  * 采用随机的密钥Key和初始化向量IV加密 * 使用随机密码的好处:系统不会产生弱密钥 * 备注:采用Base64编码格式输出密文、密钥和初始化向量 *  * 夏春涛 Email:xChuntao@163.com  * Blog:http://bluesky521.cnblogs.com * 运行环境:.net2.0 framework *//**//*  * 关于DES加密中的初始化向量IV: * 对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为 * 同一个密码文本输出块。
/**/ /*
 * 数据加密标准(DES)的C#实现(2)
 * 
 * 采用随机的密钥Key和初始化向量IV加密
 * 使用随机密码的好处:系统不会产生弱密钥
 * 备注:采用Base64编码格式输出密文、密钥和初始化向量
 * 
 * 夏春涛 Email:xChuntao@163.com 
 * Blog:
http://bluesky521.cnblogs.com
 * 运行环境:.net2.0 framework
 
*/


/**/ /* 
 * 关于DES加密中的初始化向量IV:
 * 对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为
 * 同一个密码文本输出块。如果您的纯文本流中有重复块,则您的密码文本流中也会
 * 有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以
 * 利用该信息来解密已知的密码文本块,并有可能重新获得您的密钥。为了防止这个
 * 问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的
 * 纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需
 * 要初始化向量来加密数据的第一个块。 
 
*/


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

namespace  DES_App2
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
string str_plain_text = "How are you?";
            Console.WriteLine(
"原文:" + str_plain_text);

            
string KEY_64 = ""
            
string IV_64 = "";  

            
string str_cypher_text = DES_Encrypt(str_plain_text,out KEY_64,out IV_64);
            Console.WriteLine(
"密文:" + str_cypher_text);

            Console.WriteLine(
"解密:" + DES_Decrypt(str_cypher_text, KEY_64, IV_64));

            Console.WriteLine(
"本次密钥:" + KEY_64);
            Console.WriteLine(
"本次初始化向量:" + IV_64);
            Console.WriteLine();
        }


        
DES加密/解密#region DES加密/解密
        
/**//// <summary>
        
/// DES加密
        
/// </summary>
        
/// <param name="str_plain_text">明文</param>
        
/// <param name="str_des_key">密钥,8个字符(64bit)</param>
        
/// <param name="str_des_iv">初始向量,8个字符(64bit)</param>
        
/// <returns>密文</returns>


        
static public string DES_Encrypt(string str_plain_text, out string str_des_key, out string str_des_iv)
        
{
            
string str_cypher_text = "";

            DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();

            MemoryStream ms 
= new MemoryStream();
            CryptoStream cst 
= new CryptoStream(ms, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);

            StreamWriter sw 
= new StreamWriter(cst);
            sw.Write(str_plain_text);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();
            
//-----
            str_cypher_text = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);

            str_des_key 
= Convert.ToBase64String(cryptoProvider.Key);
            str_des_iv 
= Convert.ToBase64String(cryptoProvider.IV);

            
return str_cypher_text;
        }


        
/**//// <summary>
        
/// DES解密
        
/// </summary>
        
/// <param name="str_cypher_text">密文</param>
        
/// <param name="str_des_key">密钥,8个字符(64bit)</param>
        
/// <param name="str_des_iv">初始向量,8个字符(64bit)</param>
        
/// <returns>明文</returns>

        static public string DES_Decrypt(string str_cypher_text, string str_des_key, string str_des_iv)
        
{
            
string str_plain_text = "";

            
byte[] byKey = Convert.FromBase64String(str_des_key);
            
byte[] byIV = Convert.FromBase64String(str_des_iv);

            
byte[] byEnc;
            
try
            
{
                byEnc 
= Convert.FromBase64String(str_cypher_text);
            }

            
catch
            
{
                
return null;
            }


            DESCryptoServiceProvider cryptoProvider 
= new DESCryptoServiceProvider();
            MemoryStream ms 
= new MemoryStream(byEnc);
            CryptoStream cst 
= new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
            StreamReader sr 
= new StreamReader(cst);
            str_plain_text 
= sr.ReadToEnd();


            
return str_plain_text;
        }

        
#endregion

    }

}

源码附件: /Files/bluesky521/DES_Hash_Demo.rar

目录
相关文章
|
3月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
86 1
|
12天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
34 4
2023/11/10学习记录-C/C++对称分组加密DES
|
12天前
|
算法 数据安全/隐私保护 Python
DES加密初探
本文介绍了Python中常用的DES和3DES加解密方法,包括ECB和CBC模式。通过示例代码展示了如何使用`Crypto`和`pyDes`库实现加解密,并讨论了不同的填充方式。最后,通过一道CTF例题,详细解析了从图像中提取密文、进行ASCII转换、Base64解码、凯撒解码和最终的DES解密过程。
43 4
DES加密初探
|
2月前
|
存储 安全 算法
C#一分钟浅谈:数据加密与解密技术
【10月更文挑战第3天】在数字化时代,信息安全至关重要。数据加密作为保障信息不被未授权访问的有效手段,通过特定算法将明文转换为密文,确保即使数据被截获也难以解读。本文从基础概念入手,介绍C#中实现数据加密的方法,涵盖对称加密(如AES、DES)与非对称加密(如RSA),并通过具体示例代码演示如何使用`System.Security.Cryptography.Aes`类完成AES加密和解密过程。此外,还强调了密钥管理及安全策略的重要性。
91 4
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
215 1
|
4月前
|
Java C# 数据安全/隐私保护
如何 使 Java、C# md5 加密的值保持一致
如何 使 Java、C# md5 加密的值保持一致
64 0
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
6月前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
6月前
|
Java C# 数据安全/隐私保护
|
5月前
|
C# 数据安全/隐私保护
Des加密和解密
Des加密和解密
56 0