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

  • 相关阅读:
    [linux]无法加载so文件错误
    linux找不到.so文件的解决方法
    [Linux]core文件调试方法
    LINUX下cp f无效问题
    解决IE无法查看源文件问题
    批处理获取exe返回结果
    不得不知 云计算入门必备的60条术语
    NMS
    开启和关闭(禁用)IE8加速器功能的办法
    钩子函数
  • 原文地址:https://www.cnblogs.com/taiyonghai/p/6150353.html
Copyright © 2011-2022 走看看