标签:字符 crypto key ras machine 认证 provider new har
最近在搞单点登录的设计,在设计中需要一个Token令牌的加密传输,这个令牌在整个连接单点的各个站中起着连接认证作用,如果被仿造将会有不可预计的损失,但是这个Token是要可逆的。所以像那种md5,sha之类的不可逆加密就没法用了,然后可逆的加密主要是分为对称加密和非对称加密。
直接看下面的方法:
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
标签:字符 crypto key ras machine 认证 provider new har
原文地址:http://www.cnblogs.com/revealit/p/6094750.html