.Net加密与解密——对称加密

一,思路

对称加密含有一个被称为密钥的东西,在消息发送前使用密钥对消息进行加密,得到密文并发送,接收方收到密文后,使用相同的密钥进行解密,获得原消息。

PS:使用密钥对消息进行加密的过程,由加密算法来完成的,加密算法通常也是公开的。

二,对称加密的流程

1,发送方和接收方持有相同的密钥,并严格保密

2,发送方使用密钥对消息进行加密,然后发送消息

3,接收方收到消息后,使用相同的密钥对消息进行解密

PS:在这一过程中,第三方可能截获消息,但得到的知识一堆乱码

三,Demo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography; //注意引入此命名空间
using System.IO;

namespace 对称加密与解密
{
    class Program
    {
        static void Main(string[] args)
        {
            string key = "secret key";  //密钥
            string plainText = "hello,world";  //明文

            string encryptedText = SymmetricCryPtoHelper.Encrypt(plainText, key);  //加密
            Console.WriteLine(encryptedText);

            string clearText = SymmetricCryPtoHelper.Decrypt(encryptedText, key);  //解密
            Console.WriteLine(clearText);

            Console.ReadKey();

        }
    }

    /// <summary>
    /// 对称加密帮助类
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/5/15 22:05:41</remarks>
    public class SymmetricCryPtoHelper
    {
        //对称加密算法提供器
        private ICryptoTransform encryptor;//加密器对象
        private ICryptoTransform decryptor;//解密器对象
        private const int BufferSize = 1024;

        /// <summary>
        /// Initializes a new instance of the <see cref="SymmetricCryPtoHelper"/> class.
        /// </summary>
        /// <param name="algorithmName">Name of the algorithm.</param>
        /// <param name="key">The key.</param>
        /// <remarks>Editor:v-liuhch</remarks>
        public SymmetricCryPtoHelper(string algorithmName, byte[] key)
        {
            //SymmetricAlgorithm为对称算法基类
            SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
            provider.Key = key;//指定密钥,通常为128位或者196位
            provider.IV = new byte[] { 0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};//Initialization vector ,初始化向量,避免了加密之后文字的相关部分也是重复的问题,通常为64位

            encryptor = provider.CreateEncryptor();//创建加密器对象
            decryptor = provider.CreateDecryptor();//创建解密器对象

        }

        public SymmetricCryPtoHelper(byte[] key) : this("TripleDES", key) { }

        //加密算法
        /// <summary>
        /// Encrypts the specified clear text.
        /// </summary>
        /// <param name="clearText">The clear text.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 16:56:15</remarks>
        public string Encrypt(string clearText) { 

            //创建明文流
            byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
            MemoryStream clearStream = new MemoryStream(clearBuffer);

            //创建空的密文流
            MemoryStream encryptedStream = new MemoryStream();

            /* 加密解密涉及到两个流,一个是明文流,一个是密文流
            那么必然有一个中介者,将明文流转换成密文流;或者将密文流转换成明文流;
            * .net中执行这个操作的中介者是一个流类型,叫做CryptoStream;
             *
             * 加密时构造函数参数:
             *     1,Stream:密文流(此时密文流还没有包含数据,仅仅是一个空流);
             *     2,ICryptoTransform:创建的加密器,负责进行加密计算,
             *     3,枚举:write,将流经CryptoStream的明文流写入到密文流中,最后从密文流中获得加密后的数据
            */
            CryptoStream cryptoStream = new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);

            //将明文流写入到buffer中
            //将buffer中的数据写入到cryptoStream中
            int bytesRead = 0;
            byte[] buffer = new byte[BufferSize];
            do
            {
                bytesRead = clearStream.Read(buffer, 0, BufferSize);
                cryptoStream.Write(buffer, 0, bytesRead);

            } while (bytesRead>0);

            cryptoStream.FlushFinalBlock();//清除缓冲区

            //获取加密后的文本
            buffer = encryptedStream.ToArray();
            string encryptedText = Convert.ToBase64String(buffer);
            return encryptedText;

        }

        /// <summary>
        /// 解密算法
        /// </summary>
        /// <param name="encryptedText">The encrypted text.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 16:56:22</remarks>
        public string Decrypt(string encryptedText)
        {
            byte[] encryptedBuffer = Convert.FromBase64String(encryptedText);
            Stream encryptedStream = new MemoryStream(encryptedBuffer);

            MemoryStream clearStream = new MemoryStream();
            /*
             解密时构造函数参数:
             *     1,Stream:密文流(此时密文流包含数据);
             *     2,ICryptoTransform:创建的解密器,负责进行解密计算,
             *     3,枚举:write,将密文流中的数据读出到明文流,进而再转换成明文的,原来的格式
             */
            CryptoStream cryptoStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);

            int bytesRead = 0;
            byte[] buffer = new byte[BufferSize];

            do
            {
                bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
                clearStream.Write(buffer, 0, bytesRead);

            } while (bytesRead>0);

            buffer = clearStream.GetBuffer();
            string clearText = Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length);

            return clearText;

        }

        /// <summary>
        /// Encrypts the specified clear text.
        /// </summary>
        /// <param name="clearText">The clear text.</param>
        /// <param name="key">The key.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 16:56:40</remarks>
        public static string Encrypt(string clearText, string key) {

            byte[] keyData = new byte[16];
            byte[] sourceData = Encoding.Default.GetBytes(key);
            int copyBytes = 16;
            if (sourceData.Length<16)
            {
                copyBytes = sourceData.Length;

            }

            Array.Copy(sourceData, keyData, copyBytes);
            SymmetricCryPtoHelper helper = new SymmetricCryPtoHelper(keyData);
            return helper.Encrypt(clearText);

        }

        /// <summary>
        /// Decrypts the specified encrypted text.
        /// </summary>
        /// <param name="encryptedText">The encrypted text.</param>
        /// <param name="key">The key.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 16:56:44</remarks>
        public static string Decrypt(string encryptedText, string key)
        {

            byte[] keyData = new byte[16];
            byte[] sourceData = Encoding.Default.GetBytes(key);
            int copyBytes = 16;
            if (sourceData.Length<16)
            {
                copyBytes = sourceData.Length;
            }

            Array.Copy(sourceData, keyData, copyBytes);

            SymmetricCryPtoHelper helper = new SymmetricCryPtoHelper(keyData);
            return helper.Decrypt(encryptedText);

        }

    }
}

四,隐患问题

1,发送方和接收方都需要持有密钥,并保证密钥不被泄露。

2,如果第三方非法获得了密钥,在对消息进行篡改后,重新加密发给接收方,则接收方无法辨别。既然无法判断消息是否被篡改,也无法确定消息是由谁发送过来的,无法满足完整性和可认证性。

时间: 2024-12-15 09:14:59

.Net加密与解密——对称加密的相关文章

php中des加密解密&#160;匹配C#des加密解密&#160;对称加密

原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv 是偏移量,默认偏移量和加密密匙是一样的, <?php class DES { var $key; var $iv; //偏移量 function DES( $key, $iv=0) { //key长度8例如:1234abcd $this->key = $key; if( $iv

【安全加密技术】--对称加密

转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46822663 上篇了解了<非对称加密>后 今天我来继续了解下加密技术中对称加密. 对称加密 对称加密是最传统的加密方式,比上非对称加密,缺少安全性,但是它依旧是用的比较多的加密方法. 对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即"一把钥匙开一把锁".对称加密的好处在于操作简单.管理方便.速度快.它的缺点在于密钥在 网络传输中容易被窃听,

对称加密和不对称加密原理

私钥加密(对称加密 symmetric cryptography):私钥加密算法使用单个私钥来加密和解密数据.由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到.私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密.私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换.Well-known secret key cryptographic algorithms include the Data Encryption Standard

对称加密和不对称加密

l 对称加密算法 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文.在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥.对称加密算法的特点是算法公开.计算量小.加密速度快.加密效率高.不足之处是,交易双方都使

.Net加密与解密——非对称加密之加密模式

一,非对称加密 非对称加密具有一组密钥对,一个是对外公开的,任何人都可以获取,称为公钥: 一个是自行保管并严格保密的,称为私钥. 规则如下: 由某人A的公钥加密消息,只能由A的私钥进行解密: 由A的私钥加密的消息,只能由A的公钥解密. 发送方,接收方都持有公钥/私钥对,因此一共会有四个密钥.非堆成加密的好处在于,私钥自己持有,公钥完全公开. 二,加密模式 步骤: 1,接收方公布自己的公钥,任何人都可以获得. 2,发送方使用接收方的公钥对消息进行加密,然后发送. 3,接收方使用自己的私钥对消息进行

对称加密与分对称加密的实现

一.对称加密: 1.DES(Data Encryption Standard,即数据加密标准) 详细原理参见:https://blog.csdn.net/qq_27570955/article/details/52442092 github地址:https://github.com/tarequeh/DES.git 编译:gcc -O3 des.c run_des.c -o run_des.o 注:本项目亦可以实现3DES 2.AES(Advanced Encryption Standard,即

.Net加密与解密——非对称加密之数字签名

一,从非对称加密的认证模式说起 由消息的发送方发布公钥,持有私钥. 步骤: 1,发送方公布自己的公钥,任何人都可以获得. 2,发送方使用自己的私钥对消息进行加密,然后发送. 3,接收方使用发送方的公钥对消息进行解密. 缺点: 1,任何截获该消息的第三方都能够使用发送方公钥进行解密: 2,耗时,不适用于大数据 二,数字签名       过程: 1,发送方对想要传递的消息进行散列运算,得到原始消息摘要.(摘要可以代表消息本身,相当于指纹) 2,发送方使用自己的私钥只对消息摘要进行加密,该过程也称作签

安全与加密-使用gpg实现加密与解密

对称加密算法 加密和解密使用同一个密钥 常见的算法: DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5 ? 特性: 1.加密.解密使用同一个密钥,效率高 2.将原始数据分割成固定大小的块,逐个进行加密 ? 缺陷: 1.密钥过多 2.密钥分发 3.数据来源无法确认 非对称加密算法 公钥加密:密钥是成对出现 ? 公钥:公开给所有人:public key ? 私钥:自己留存,必须保证其私密性:secret key ? 特点:用公钥加密数据,只能使用与之配对的私钥

使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

本文全部源代码下载:/Files/chnking/EncryptLongData.rar 一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数”.也就是说对于1024位密钥的RSA来说,一次只能加密128字节的数据,对于Dotnet的RSA实现更是只能加密117个字节的数据. 这就引出一个问题,超