#region RSA public static byte[] GetBytes(String num) { BigInteger n = new BigInteger(num, 10); String s = n.ToString(2); if (s.Length % 8 > 0) { s = new String('0', 8 - s.Length % 8) + s; } byte[] data = new byte[s.Length / 8]; String ocetstr; for (int i = 0; i < data.Length; i++) { ocetstr = s.Substring(8 * i, 8); data[i] = Convert.ToByte(ocetstr, 2); } return data; } /// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static String ConvByteArrayToHex(byte[] data) { String s = ""; for (int i = 0; i < data.Length; i++) { s += Convert.ToString(data[i], 16); } return s.ToUpper(); } public static string RSAEncrypt(string Modulus, string Exponent, string content) { var param = new RSAParameters(); param.Exponent = GetBytes(Exponent); param.Modulus = GetBytes(Modulus); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(param); int CellLength = new BigInteger(param.Modulus).bitCount() / 8; byte[] bInput = Encoding.UTF8.GetBytes(content); int MaxLength = CellLength - 11; int GroupLength = (int)Math.Ceiling(bInput.Length * 1.00 / MaxLength); byte[] cipherText = new byte[GroupLength * CellLength]; for (int i = 0; i < GroupLength; i++) { int len = MaxLength < bInput.Length - MaxLength * i ? MaxLength : bInput.Length - MaxLength * i; byte[] inByte = new byte[len]; Buffer.BlockCopy(bInput, MaxLength * i, inByte, 0, len); byte[] temp = rsa.Encrypt(inByte, false); Buffer.BlockCopy(temp, 0, cipherText, i * CellLength, CellLength); } //cipherText = rsa.Encrypt(bInput, false); //return Convert.ToBase64String(cipherText); //return toHex(cipherText); return BitConverter.ToString(cipherText).Replace("-", ""); } #endregion