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


    /*
     * 数据加密标准(DES)的C#实现(4)
     * 
     * 采用自定义的密钥Key和初始化向量IV加密
     * 
     * 夏春涛 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_App4
    {
        
    class Program
        
    {
            
    static void Main(string[] args)
            
    {
                
    string str_plain_text = "How are you?";//原文
                Console.WriteLine("原文:" + str_plain_text);

                
    string KEY_64 = "a4G-8=Jk"//必须是8个字符(64Bit)
                string IV_64 = "JKbN=5[?";  //必须8个字符(64Bit)
                Console.WriteLine("密钥:" + KEY_64);
                Console.WriteLine(
    "初始化向量:" + IV_64);
                
    //----
                string str_cypher_text = Encrypt(str_plain_text, KEY_64, IV_64);
                Console.WriteLine(
    "密文:" + str_cypher_text);

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


            
    static public string Encrypt(string PlainText, string KEY_64, string IV_64)
            
    {
                
    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
                
    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);

                DESCryptoServiceProvider cryptoProvider 
    = new DESCryptoServiceProvider();
                
    int i = cryptoProvider.KeySize;
                MemoryStream ms 
    = new MemoryStream();
                CryptoStream cst 
    = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);

                StreamWriter sw 
    = new StreamWriter(cst);
                sw.Write(PlainText);
                sw.Flush();
                cst.FlushFinalBlock();
                sw.Flush();
                
    return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);

            }


            
    static public string Decrypt(string CypherText, string KEY_64, string IV_64)
            
    {
                
    byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
                
    byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);

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

                
    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);
                
    return sr.ReadToEnd();
            }


        }

    }

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

  • 相关阅读:
    【转】如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
    【转】PCIe DMA
    【转】PCIe学习(二)——PCIe DMA关键模块分析之一
    PCIe配置空间
    [转]PCIe学习笔记之MSI/MSI-x中断及代码分析
    [转]常用通信接口保护电路
    [转]原理图和PCB元件对应查找--Altium Designer
    [原]PCB中MARK点制作
    [转]使用Altium Designer软件铺铜后再挖铜
    支持Json进行操作的Javascript类库TAFFY DB
  • 原文地址:https://www.cnblogs.com/SummerRain/p/1005582.html
Copyright © 2020-2023  润新知