C#对称加密(3des)和非对称加密(rsa)算法

3DES加密/解密算法的C#实现:(实现的方式很多,仅供参考)

public static bool DecryptFromBase64(string base64String, string key,out string DecryptString)
        {
            DecryptString = "";
            try
            {
                // encode to bytes
                byte[] KEY = HexStringToByteArray(key);
                byte[] CRYPTSTRING = Convert.FromBase64String(base64String);

                //set iv and key
                byte[] tmpiv = { 49, 50, 51, 52, 53, 54, 55, 56 };
                byte[] tmpkey = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 };

                for (int ii = 0; ii < 24; ii++)
                {
                    tmpkey[ii] = KEY[ii];
                }

                TripleDESCryptoServiceProvider dsp = new TripleDESCryptoServiceProvider();
                dsp.Mode = System.Security.Cryptography.CipherMode.CBC;
                dsp.Padding = System.Security.Cryptography.PaddingMode.PKCS7;

                ICryptoTransform tridesencrypt = dsp.CreateDecryptor(tmpkey, tmpiv);

                using (var ms = new MemoryStream(CRYPTSTRING))
                {
                    using (var cs = new CryptoStream(ms, tridesencrypt, CryptoStreamMode.Read))
                    {
                        var sr = new StreamReader(cs, Encoding.UTF8);
                        // 2015/11/11 修改 读取全部内容,而不是只读第一行,此问题乃是算法的bug
                        DecryptString = sr.ReadToEnd();// sr.ReadLine();
                    }
                }

                dsp.Clear();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        public static bool Crypt3DESToBase64(string CryptString, string Key, out string DecryptString)
        {
            DecryptString = "";
            try
            {
                // encode to bytes
                byte[] KEY = HexStringToByteArray(Key);
                byte[] CRYPTSTRING = System.Text.Encoding.UTF8.GetBytes(CryptString);

                //set iv and key
                byte[] tmpiv = { 49, 50, 51, 52, 53, 54, 55, 56 };
                byte[] tmpkey = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 };

                for (int ii = 0; ii < 24; ii++)
                {
                    tmpkey[ii] = KEY[ii];
                }

                TripleDESCryptoServiceProvider dsp = new TripleDESCryptoServiceProvider();
                dsp.Mode = System.Security.Cryptography.CipherMode.CBC;
                dsp.Padding = System.Security.Cryptography.PaddingMode.PKCS7;

                ICryptoTransform tridesencrypt = dsp.CreateEncryptor(tmpkey, tmpiv);

                byte[] results = tridesencrypt.TransformFinalBlock(CRYPTSTRING, 0, CRYPTSTRING.Length);

                DecryptString = Convert.ToBase64String(results);

                dsp.Clear();

                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        public static byte[] HexStringToByteArray(string s)
        {
            Byte[] buf = new byte[s.Length / 2];
            for (int i = 0; i < buf.Length; i++)
            {
                buf[i] = (byte)(chr2hex(s.Substring(i * 2, 1)) * 0x10 + chr2hex(s.Substring(i * 2 + 1, 1)));
            }
            return buf;
        }

        private static byte chr2hex(string chr)
        {
            switch (chr)
            {
                case "0":
                    return 0x00;
                case "1":
                    return 0x01;
                case "2":
                    return 0x02;
                case "3":
                    return 0x03;
                case "4":
                    return 0x04;
                case "5":
                    return 0x05;
                case "6":
                    return 0x06;
                case "7":
                    return 0x07;
                case "8":
                    return 0x08;
                case "9":
                    return 0x09;
                case "A":
                    return 0x0a;
                case "B":
                    return 0x0b;
                case "C":
                    return 0x0c;
                case "D":
                    return 0x0d;
                case "E":
                    return 0x0e;
                case "F":
                    return 0x0f;
            }
            return 0x00;
        }

  在以上算法中,key为一个48位的字符串,别的就没特别要注意的了。

RSA加密算法(根据MSDN文档实现):

        /// <summary>
        /// 使用rsa非对称加密算法加密文本内容
        /// </summary>
        /// <param name="contentBytes">待加密内容byte数组</param>
        /// <param name="publicKey">公开密钥</param>
        /// <param name="DoOAEPPadding">建议为false</param>
        /// <returns>加密后的byte[]</returns>
        public static byte[] RSAEncryptContent(byte[]contentBytes,RSAParameters publicKey,bool DoOAEPPadding)
        {
            try
            {
                byte[] encryptedData;
                using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
                {
                    provider.ImportParameters(publicKey);

                    encryptedData = provider.Encrypt(contentBytes, DoOAEPPadding);
                }
                return encryptedData;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        /// <summary>
        /// 使用rsa非对称加密算法进行解密
        /// </summary>
        /// <param name="cryptContentBytes">加密后的字节数组</param>
        /// <param name="privateKey">私有密钥</param>
        /// <param name="DoOAEPPadding">建议为false</param>
        /// <returns>解密后的内容数组</returns>
        public static byte[] RSADescryptContent(byte[]cryptContentBytes,RSAParameters privateKey,bool DoOAEPPadding)
        {
            try
            {
                byte[] decryptData;
                using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
                {
                    provider.ImportParameters(privateKey);

                    decryptData = provider.Decrypt(cryptContentBytes, DoOAEPPadding);
                }
                return decryptData;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }

  使用RSA加密/解密算法的方法:

                   //content为要进行加密的字符串            byte[] contentBytes = byteConverter.GetBytes(content);
            byte[] encryptBytes;
            byte[] decryptBytes;

            //待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11)
            int maxBlockSize;
            using(RSACryptoServiceProvider provider=new RSACryptoServiceProvider())
            {
                maxBlockSize = provider.KeySize / 8 - 11;

                RSAParameters publicKey = provider.ExportParameters(false);

                // 小于最大块值,直接加密
                if (contentBytes.Length <= maxBlockSize)
                {
                    encryptBytes = EncryptContent(contentBytes, publicKey, false);
                }
                else
                {
                    // 分块儿加密
                    using(MemoryStream plaintStream=new MemoryStream(contentBytes))
                    using(MemoryStream cryptStream=new MemoryStream())
                    {
                        byte[] buffer = new byte[maxBlockSize];
                        int blockSize = plaintStream.Read(buffer, 0, maxBlockSize);
                        while(blockSize>0)
                        {
                            byte[] encryptBlock = new byte[blockSize];
                            Array.Copy(buffer, encryptBlock, blockSize);
                            byte[]encryptedBlock=EncryptContent(encryptBlock,publicKey,false);
                            cryptStream.Write(encryptedBlock, 0, encryptedBlock.Length);

                            blockSize = plaintStream.Read(buffer, 0, maxBlockSize);
                        }
                        encryptBytes = cryptStream.ToArray();
                    }
                }
                //加密后的字符串
                string encryptString = byteConverter.GetString(encryptBytes);

                Console.WriteLine("加密结束");
                Console.ReadLine();
                Console.ReadLine();                // 以下为解密过程,解密过程也会有长度限制,可参考加密的方式进行解密
                //string encryptString = byteConverter.GetString(encryptBytes);

                //RSAParameters privateKey = provider.ExportParameters(true);

                //decryptBytes = DecryptContent(encryptBytes, privateKey, false);

                //string decryptString = byteConverter.GetString(decryptBytes);
                //Console.WriteLine(decryptString);
            }

  

时间: 2024-10-29 19:06:46

C#对称加密(3des)和非对称加密(rsa)算法的相关文章

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

转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46810595 看过上篇网络互联基系列基础的朋友,对安全产生的原因以及策略度有所了解,当然作为开发者来讲,网络传输中的安全问题我们不必过多的关心,我们关心的是发送方加密和接收方对数据的解密过程,也就是网络安全中的一面边缘学科,密码学中的一种数据加密技术,目前业界的加密方式主要有对称加密和非堆成加密,那就先来了解下有非对称加密以及所关联的相关名字. 非对称加密 非对称加密算法是一种密

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

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

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

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

非对称加密算法-RSA算法

??加密算法分为对称加密算法和非对称加密算法,其中非对称加密算法作为计算机通信安全的基石,在保证数据安全方面起着重要的作用.而相对于对称加密算法的易理解性,非对称加密算法存在一定的难度.下面通过对RSA算法的剖析,让我们更好的理解非对称加密算法的原理. 一.对称加密算法和非对称加密算法 1.对称加密算法 ??对称加密算法:加密和解密都使用同样规则(密钥)的算法. ??(1).A选择某一种规则对信息进行加密: ??(2).B使用同一规则(逆规则)对信息进行解密: 2.非对称加密算法 ??非对称加密

Java对称与非对称加密解密,AES与RSA

加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么要有非对称加密,解密技术呢 假设这样一种场景A要发送一段消息给B,但是又不想以明文发送,所以就需要对消息进行加密.如果采用对称加密技术,那么加密与解密用的是同一把秘钥.除非B事先就知道A的秘钥,并且保存好.这样才可以解密A发来的消息. 由于对称技术只有一把秘钥,所以秘钥的管理是一个很麻烦的问题.而非

第10章 网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 (1)截获:攻击者从网络上窃听他人的通信内容,通常把这类攻击称为"截获".在被动攻击中,攻击者只是观察和分析某一个协议数据单元(PDU)而不干扰信息流. (2)篡改:攻击者篡改网络上传递的报文.这里包括彻底中断传递的报文,甚至把完全伪造的报文传送给接收方,这种攻击也有时也称为"更改报文流".如DNS劫持(域名劫持),安装黑客软件Cain可以进行验证. (3)恶意程序:是一种特殊的主动攻击形式.如计算机病毒.蠕虫.木

对称加密与非对称加密 浅析

对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中. 对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解:但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费

非对称加密技术- RSA算法数学原理分析

非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密.但是对于其原理大部分同学应该都是一知半解,今天就来分析下经典的非对称加密算法 - RSA算法.通过本文的分析,可以更好的理解非对称加密原理,可以让我们更好的使用非对称加密技术. 题外话: 本博客一直有打算写一系列文章通俗的密码学,昨天给站点上https, 因其中使用了RSA算法,就查了一下,发现现在网上介绍RSA算法的文章都写

Java结合keytool实现非对称加密和解密

在Java安全体系中,签名属于JAAS模块,加解密属于JCE模块.keytool的使用keytool是JDK自带的一个密钥库管理工具.这里只用到了keytool的部分功能,包括生成密钥对,导出公钥等.keytool生成的公钥/私钥对存放到一个到了一个文件中,这个文件有密码保护,通称为keystore.生成密钥对$ keytool -genkey -alias signLegal -keystore examplestanstore2 -validity 1800 -keyalg RSA生成别名为

关于非对称加密的一点解说

非对称加密定义: 非对称加密算法又称现代加密算法 1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”. 对称加密定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆