C# RSA 无 长度限制 加密解密 示例

来源:互联网 发布:中医客户档案软件 编辑:程序博客网 时间:2024/06/05 06:36

RSA 是一种非对称加密算法。由于算法特性,加密和解密过程用不同密钥,即公钥和私钥,而被广泛应用于数字证书的安全管理。 在具体应用中,公钥用加密而私钥用于解密,或 私钥用于数字签名而公钥用于签名验证。由于非对称加密算法比价复杂,耗时较长,所以一般在网络环境中RAS 被应用于 签名认证,或小数据传输,如 AES 对称密钥传输。

在.Net 框架中,默认提供的辅助类只能对密钥长度大小相同的数据进行加密解密。 此文提供C# RSA 算法示例一座优化,可以不限数据大小。此实例 仅供交流学习。

RSA 加密

        public string RsaEncrypt(string rawInput, string publicKey)        {            if (string.IsNullOrEmpty(rawInput))            {                return string.Empty;            }            if(string.IsNullOrWhiteSpace(publicKey))            {                throw new ArgumentException("Invalid Public Key");            }            using (var rsaProvider = new RSACryptoServiceProvider())            {                var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流                rsaProvider.FromXmlString(publicKey);//载入公钥                int bufferSize = (rsaProvider.KeySize / 8) - 11;//单块最大长度                var buffer = new byte[bufferSize];                using (MemoryStream inputStream = new MemoryStream(inputBytes),                     outputStream = new MemoryStream())                {                    while (true)                    { //分段加密                        int readSize = inputStream.Read(buffer, 0, bufferSize);                        if (readSize <= 0)                        {                            break;                        }                        var temp = new byte[readSize];                        Array.Copy(buffer, 0, temp, 0, readSize);                        var encryptedBytes = rsaProvider.Encrypt(temp, false);                        outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);                    }                    return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输                }            }        }

RSA 解密

        public string RsaDecrypt(string encryptedInput, string privateKey)        {            if (string.IsNullOrEmpty(encryptedInput))            {                return string.Empty;            }            if (string.IsNullOrWhiteSpace(privateKey))            {                throw new ArgumentException("Invalid Private Key");            }            using (var rsaProvider = new RSACryptoServiceProvider())            {                var inputBytes = Convert.FromBase64String(encryptedInput);                rsaProvider.FromXmlString(privateKey);                int bufferSize = rsaProvider.KeySize / 8;                var buffer = new byte[bufferSize];                using (MemoryStream inputStream = new MemoryStream(inputBytes),                     outputStream = new MemoryStream())                {                    while (true)                    {                        int readSize = inputStream.Read(buffer, 0, bufferSize);                        if (readSize <= 0)                        {                            break;                        }                        var temp = new byte[readSize];                        Array.Copy(buffer, 0, temp, 0, readSize);                        var rawBytes = rsaProvider.Decrypt(temp, false);                        outputStream.Write(rawBytes, 0, rawBytes.Length);                    }                    return Encoding.UTF8.GetString(outputStream.ToArray());                }            }        }
0 0
原创粉丝点击