• 非对称加密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

  • 相关阅读:
    poj 3096 Surprising Strings (set)
    hdu 4038 stone
    STL set 使用总结
    poj 3185 The Water Bowls (bfs 加未压缩)
    QPixmap显示图片
    addStretch的作用 .
    Qt SizeHint()
    StyleSheet
    linux编程守护进程编写
    Qt样式表的使用
  • 原文地址:https://www.cnblogs.com/Jeely/p/11727480.html
Copyright © 2020-2023  润新知