#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