加密技术与认证技术

20 篇文章 0 订阅

1、对称加密

又称为私人密钥加密/共享密钥加密,加密与解密使用同一密钥。

对称加密:ke=kd。

特点:

(1)加密强度不高,但效率高;

(2)密钥分发困难。(大量明文为了保证加密效率一般使用对称加密)

常见对称密钥加密算法:DES、3DES(三重DES)、AES、RC-5、IDEA算法。

2、非对称加密

又称为公开密钥加密。

非对称加密ke!=kd;       密钥必须成对使用(公钥加密,相应的私钥解密)

特点:加密速度慢,但强度高。

常见非对称密钥加密算法:RSA、DSA、ECC。

算法类型

算法

对称加密算法(共享密钥)

分组加密

DES、AES、3DES、IDEA等

流密码

RC-5等

非对称加密算法(公开密钥)

RSA、DSA、ECC等

3、数字签名

数字签名的过程如图所示(发送者使用自己的私钥对摘要签名,接收者利用发送者的公钥对接收到的摘要进行验证)

4、数字摘要

由单向散列函数加密成固定长度的散列值。

常见的摘要算法:MD5(128位)、SHA(160位),由于SHA通常采用的密钥长度较长,因此安全性高于MD5.

签名的作用:

①接收者可验证消息来源的真实性;

②发送者无法否认发送过该消息;

③接收者无法伪造或篡改消息。

签名的过程:

①信息发送者使用一个单向散列函数(Hash函数)对信息生成信息摘要。

②信息发送者使用自己的私钥签名信息摘要。

③信息发送者把信息本身和已签名的信息摘要一起发送出去。

④信息接收者通过使用与信息发送者使用的同一个单向散列函数(Hash函数)对接收的信息本身生成新的信息摘要,再使用信息发送者的公钥对信息摘要进行验证,以确认信息发送者的身体和信息是否被修改过。

5、数字证书的应用

1)、数字证书的内容包括:CA签名、用户信息(用户名称)、用户公钥等。

2)、证书中的CA签名验证数字证书的可靠性。

3)、用户公钥:客户端利用证书中的公钥加密,服务器利用自己的私钥解密。

6、C#中使用

1.MD5使用

MD5公开的算法,任何语言实现后其实都一样,通用的。不可逆加密:原文--加密--密文,密文无法解密出原文。
1)相同原文加密的结果是一样的
2)不同长度的内容加密后加过都是32位
3) 原文差别很小,结果差别很大
4)不管文件多大,都能产生32位长度摘要
        文件内容有一点改动,结果变化非常大
          文件内容不变,名字变了,结果是不变

字符串加密方法:

     public static string Encrypt(string source,int length=32)
        {
            if (string.IsNullOrEmpty(source))
            {
                return string.Empty;
            }
            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
            byte[] bytes = Encoding.UTF8.GetBytes(source);
            byte[] hashValue = provider.ComputeHash(bytes);
            StringBuilder sb = new StringBuilder();
            switch (length)
            {
                case 16:
                    for (int i = 4; i < 12; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                    
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return sb.ToString();
        }

文件摘要提取:

 public static string AbstractFile(Stream stream)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] retVal = md5.ComputeHash(stream);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            return sb.ToString();
        }

2、DES使用

密钥长度8,即_rgbKey、_rgbIV数据长度为8。加密算法都是公开的,密钥是保密的, 即使拿到密文,也无法推算密钥,也推算不了原文。

加密方法:


        public static string Encrypt(string text)
        {

            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
            using (MemoryStream memStream = new MemoryStream())
            {
                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
                StreamWriter sWriter = new StreamWriter(crypStream);
                sWriter.Write(text);
                sWriter.Flush();
                crypStream.FlushFinalBlock();
                memStream.Flush();
                return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
            }
        }

解密方法:

 public static string Decrypt(string encryptText)
        {
            DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
            byte[] buffer = Convert.FromBase64String(encryptText);

            using (MemoryStream memStream = new MemoryStream())
            {
                CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
                crypStream.Write(buffer, 0, buffer.Length);
                crypStream.FlushFinalBlock();
                return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
            }
        }

3.RSA

加密后能解密回原文,加密key和解密key是一对。算法是公开的,加密key和解密key是不能互相推导的 ,有了密文,没有解密key,也推导不出原文。

加密方法:

  public static string Encrypt(string content,string encryptKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(encryptKey);
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            byte[] DataToEncrypt = ByteConverter.GetBytes(content);
            byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
            return Convert.ToBase64String(resultBytes);
        }

解密方法:

  public static string Decrypt(string content,string decryptKey)
        {
            byte[] dataToDecrypt = Convert.FromBase64String(content);
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(decryptKey);
            byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            return ByteConverter.GetString(resultBytes);
        }

调用:

  KeyValuePair<string, string> encryptDecrypt = RsaEncrypt.GetKeyPair();
                string rsaEn1 = RsaEncrypt.Encrypt("F896ADCB-9D5A-4751-8037-02C913B48F38", encryptDecrypt.Key);
                string rsaDe1 = RsaEncrypt.Decrypt(rsaEn1, encryptDecrypt.Value);
                Console.WriteLine("************************************");
                Console.WriteLine("加密后:" + rsaEn1);
                Console.WriteLine("解密后:" + rsaDe1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值