RAS加密
背景介绍:在对接京东VOP的接口时使用他们的sdk,由于他们后台是用的Java我方后台用的是.net 不管我们怎么用RSA加密都对不上。之后在网上找了半天都没有找到,之后突然想到可能是因为两种语言加密底层是不一样的导致的。
C# 使用下面的这种加密规则就和java的加密对上了
/// <summary>用私钥给数据进行RSA加密
///
/// </summary>
/// <param name="xmlPrivateKey">私钥</param>
/// <param name="m_strEncryptString">待加密数据</param>
/// <returns>加密后的数据(Base64)</returns>
public static string RSAEncryptByPrivateKey(string xmlPrivateKey, string strEncryptString)
{
//加载私钥
RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(xmlPrivateKey));
privateRsa.FromXmlString(PemPrivateKeyToXml(privateKeyParam));
//转换密钥
AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 参数与Java中加密解密的参数一致
//第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
c.Init(true, keyPair.Private);
byte[] DataToEncrypt = Encoding.UTF8.GetBytes(strEncryptString);
byte[] outBytes = c.DoFinal(DataToEncrypt);//加密
string strBase64 = Convert.ToBase64String(outBytes);
return strBase64;
}
私钥转换位XML
/// <summary>
/// Pem私钥转成XML私钥
/// </summary>
/// <param name="pemPrivateKeyStr"></param>
/// <returns></returns>
private static string PemPrivateKeyToXml(RsaPrivateCrtKeyParameters pemPrivateKey)
{
var p = new RSAParameters
{
Modulus = pemPrivateKey.Modulus.ToByteArrayUnsigned(),
Exponent = pemPrivateKey.PublicExponent.ToByteArrayUnsigned(),
D = pemPrivateKey.Exponent.ToByteArrayUnsigned(),
P = pemPrivateKey.P.ToByteArrayUnsigned(),
Q = pemPrivateKey.Q.ToByteArrayUnsigned(),
DP = pemPrivateKey.DP.ToByteArrayUnsigned(),
DQ = pemPrivateKey.DQ.ToByteArrayUnsigned(),
InverseQ = pemPrivateKey.QInv.ToByteArrayUnsigned(),
};
string xmlPrivateKeyStr;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(p);
xmlPrivateKeyStr = rsa.ToXmlString(true);
}
return xmlPrivateKeyStr;
}
Base64位加密
/// <summary>
/// 64位加密
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string Base64Encode(string source)
{
return Base64Encode(Encoding.UTF8, source);
}
public static string Base64Encode(Encoding encodeType, string source)
{
string encode = string.Empty;
byte[] bytes = encodeType.GetBytes(source);
try
{
encode = Convert.ToBase64String(bytes);
}
catch
{
encode = source;
}
return encode;
}
Md5 加密
/// <summary>
/// md5
/// </summary>
/// <returns></returns>
public static string MD5Encry(string str)
{
byte[] buffer = Encoding.Default.GetBytes(str); //将字符串解析成字节数组,随便按照哪种解析格式都行
MD5 md5 = MD5.Create(); //使用MD5这个抽象类的Creat()方法创建一个虚拟的MD5类的对象。
byte[] bufferNew = md5.ComputeHash(buffer); //使用MD5实例的ComputerHash()方法处理字节数组。
string strNew = null;
for (int i = 0; i < bufferNew.Length; i++)
{
strNew += bufferNew[i].ToString("x2"); //对bufferNew字节数组中的每个元素进行十六进制转换然后拼接成strNew字符串
}
return strNew;
}
这里用到了几个包
Org.BouncyCastle.Crypto.Parameters
System.Security.Cryptography