最近在搞单点登录的设计,在设计中需要一个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
时间: 2024-10-23 23:29:14