zoukankan      html  css  js  c++  java
  • 非对称加密RSA的C#实现

    1.对称加密算法

    对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。

    对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥,

    一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,

    不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。

    密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

    常用对称加密:DES、3DES、AES等

    (代码后续添加)

    2.非对称加密算法

    非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。

    私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

    比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。

    与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

    常用非对称加密:DSA、RSA等

    目前C#中提供的RSA非对称加密(其他语言如JAVA是可以逆向加解密的,但没有测试过),只能使用公钥进行加密,只能使用私钥进行解密,不能逆向使用(私钥无法加密,公钥无法解密),

    因为这样的安全性更高,不会出现私钥加密后的数据,所有公钥持有者都可以解密的问题,如果一定要有这种需求出现,则可以使用

    第三方的加解密组件BouncyCastle来实现

    复制代码
    //引入命名空间
    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    
    
    //RSA测试实例
    string oldData = "taiyonghai";
    CreateRSAKey();
    string ciphertext = RSAEncrypt(oldData);
    string newData = RSADecrypt(ciphertext);
    
    
    /// <summary>
    /// 创建RSA公钥私钥
    /// </summary>
    public void CreateRSAKey()
    {
        //设置[公钥私钥]文件路径
        string privateKeyPath = @"d:\PrivateKey.xml";
        string publicKeyPath = @"d:\PublicKey.xml";
        //创建RSA对象
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        //生成RSA[公钥私钥]
        string privateKey = rsa.ToXmlString(true);
        string publicKey = rsa.ToXmlString(false);
        //将密钥写入指定路径
        File.WriteAllText(privateKeyPath, privateKey);//文件内包含公钥和私钥
        File.WriteAllText(publicKeyPath, publicKey);//文件内只包含公钥
    }
    /// <summary>
    /// 使用RSA实现加密
    /// </summary>
    /// <param name="data">加密数据</param>
    /// <returns></returns>
    public string RSAEncrypt(string data)
    {
        //C#默认只能使用[公钥]进行加密(想使用[公钥解密]可使用第三方组件BouncyCastle来实现)
        string publicKeyPath = @"d:\PublicKey.xml";
        string publicKey = File.ReadAllText(publicKeyPath);
        //创建RSA对象并载入[公钥]
        RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();
        rsaPublic.FromXmlString(publicKey);
        //对数据进行加密
        byte[] publicValue = rsaPublic.Encrypt(Encoding.UTF8.GetBytes(data), false);
        string publicStr = Convert.ToBase64String(publicValue);//使用Base64将byte转换为string
        return publicStr;
    }
    /// <summary>
    /// 使用RSA实现解密
    /// </summary>
    /// <param name="data">解密数据</param>
    /// <returns></returns>
    public string RSADecrypt(string data)
    {
        //C#默认只能使用[私钥]进行解密(想使用[私钥加密]可使用第三方组件BouncyCastle来实现)
        string privateKeyPath = @"d:\PrivateKey.xml";
        string privateKey = File.ReadAllText(privateKeyPath);
        //创建RSA对象并载入[私钥]
        RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();
        rsaPrivate.FromXmlString(privateKey);
        //对数据进行解密
        byte[] privateValue = rsaPrivate.Decrypt(Convert.FromBase64String(data), false);//使用Base64将string转换为byte
        string privateStr = Encoding.UTF8.GetString(privateValue);
        return privateStr;
    }
    复制代码

    附录:

    在线加解密站点:http://web.chacuo.net/netrsakeypair

  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/Jeely/p/11727480.html
Copyright © 2011-2022 走看看