基于C#的RSA非对称加密算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C#的RSA非对称加密算法相关的知识,希望对你有一定的参考价值。

最近在搞单点登录的设计,在设计中需要一个Token令牌的加密传输,这个令牌在整个连接单点的各个站中起着连接认证作用,如果被仿造将会有不可预计的损失,但是这个Token是要可逆的。所以像那种md5,sha之类的不可逆加密就没法用了,然后可逆的加密主要是分为对称加密和非对称加密。

  • 对称加密:用加密的钥匙来解密,比如DES,AES的加解密。
  • 非对称加密:一个钥匙加密,用另一个钥匙解密。

直接看下面的方法:

1、首先生成密钥对

/// <summary>
/// RSA加密的密匙结构  公钥和私匙
/// </summary>
public struct RSAKey
{
    public string PublicKey { get; set; }
    public string PrivateKey { get; set; }
}

#region 得到RSA密匙对
/// <summary>
/// 得到RSA密匙对
/// </summary>
/// <returns></returns>
public static RSAKey GetRASKey()
{
    RSACryptoServiceProvider.UseMachineKeyStore = true;
    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(DWKEYSIZE);
    RSAParameters p = rsaProvider.ExportParameters(true);

    return new RSAKey()
    {
        PublicKey = ComponentKey(p.Exponent, p.Modulus),
        PrivateKey = ComponentKey(p.D, p.Modulus)
    };
}
#endregion
#region 将密匙组合成base64字符串
/// <summary>
/// 将密钥组合成base64编码字符串
/// </summary>
private static string ComponentKey(byte[] b1, byte[] b2)
{
    List<byte> list = new List<byte>();
    list.Add((byte)b1.Length);
    list.AddRange(b1);
    list.AddRange(b2);
    byte[] b = list.ToArray<byte>();
    return Convert.ToBase64String(b);
}

/// <summary>
/// 从base64字符串,解析原来的密钥
/// </summary>
private static void ResolveKey(string key, out byte[] b1, out byte[] b2)
{
    //从base64字符串 解析成原来的字节数组
    byte[] b = Convert.FromBase64String(key);
    //初始化参数的数组长度
    b1 = new byte[b[0]];
    b2 = new byte[b.Length - b[0] - 1];
    //将相应位置是值放进相应的数组
    for (int n = 1, i = 0, j = 0; n < b.Length; n++)
    {
        if (n <= b[0])
        {
            b1[i++] = b[n];
        }
        else
        {
            b2[j++] = b[n];
        }
    }
}
#endregion

 

以上是关于基于C#的RSA非对称加密算法的主要内容,如果未能解决你的问题,请参考以下文章

(转)C#实现RSA非对称加密解密

.NET Core加解密实战系列之——RSA非对称加密算法

非对称加密及RSA加密算法

加密算法之非对称加密RSA

常见的非对称加密算法及主要特征

RSA加密原理:非对称加密鼻祖