上篇文章中写的RSA加密是针对C#的,现在外部调用的是PHP,我们平常见到的RSA无论公钥和私钥都是一长串数字,很显然C#生成的XML不是通用的加密。如果外部调用需要处理一下。

一、首先可以去网上找一些生成RSA密钥的工具,生成公钥和私钥。

二、拿到公钥和私钥需要处理一下,转换个XML格式的公钥和私钥

public class BouncyCastle
{
public static string RSAPrivateKeyJava2DotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey)); return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
}
/// <summary>
/// RSA公钥格式转换,java->.net
/// </summary>
/// <param name="publicKey">java生成的公钥</param>
/// <returns></returns>
public static string RSAPublicKeyJava2DotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}
}

三、生成工具生成的是2048位的公钥和私钥,这里加密和解密也要用2048位的

 #region RSA的加密函数

        //##############################################################################
//RSA 方式加密
//说明KEY必须是XML的行式,返回的是字符串
//在有一点需要说明!!该加密方式有 长度 限制的!!
//##############################################################################
//RSA的加密函数 string
public static string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
{
byte[] PlainTextBArray;
byte[] CypherTextBArray;
string Result;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
PlainTextBArray = (new UTF8Encoding()).GetBytes(m_strEncryptString);
CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
Result = Convert.ToBase64String(CypherTextBArray);
return Result;
} #endregion #region RSA的解密函数
//RSA的解密函数 string
public static string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
{
xmlPrivateKey = BouncyCastle.RSAPrivateKeyJava2DotNet(xmlPrivateKey);
byte[] PlainTextBArray;
byte[] DypherTextBArray;
string Result;
System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
DypherTextBArray = rsa.Decrypt(PlainTextBArray, false); Result = (new UTF8Encoding()).GetString(DypherTextBArray);
return Result; } #endregion

四、加密和解密

        /// <summary>
/// 加密
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult RSAEncrypt(RSARequest model)
{
string publicKey = BouncyCastle.RSAPublicKeyJava2DotNet(model.XmlPublicKey);
string encryptionStr = RSACryption.RSAEncrypt(publicKey, model.StrEncryptString);
return Ok(new
{
code = ResultCode.Success,
encryptionStr = encryptionStr,
message = "加密成功!"
});
} /// <summary>
///解密
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult RSADecrypt(RSADecryptRequest model)
{
string str_Plain_Text = RSACryption.RSADecrypt(model.XmlPrivateKey, model.StrDecryptString);
return Ok(new
{
code = ResultCode.Success,
encryptionStr = str_Plain_Text,
message = "解密成功!"
});
}

最新文章

  1. Java 8 新特性之泛型的类型推导
  2. [JS]笔记14之事件委托
  3. 实现统一用户体验的BaseActivity
  4. 如何设置mysql的表不区分你大小写
  5. KMP详解
  6. php概率算法(转)
  7. C/C++文件操作1
  8. 怎样提高Windows Azure Cloud Service中的WebRole的文件访问权限
  9. Rebar:Erlang构建工具
  10. My97DatePicker源码的K方法
  11. MS SQL SERVER: msdb.dbo.MSdatatype_mappings &amp; msdb.dbo.sysdatatypemappings
  12. C语言计算程序运行时间
  13. EAFP和LBYL 两种防御性编程风格
  14. 《python基础教程》笔记之 元组
  15. windows理论基础(一)
  16. 【百度地图API】让用户选择起点和终点的驾车导航
  17. sql 针对拼接语句的优化
  18. Python 使用一等函数实现设计模式
  19. spring cloud+dotnet core搭建微服务架构:配置中心(四)
  20. OpenCV函数学习:alignPtr对齐指针

热门文章

  1. jmeter md5加密请求参数
  2. Java中String、StringBuilder和StringBuffer
  3. 题解 [51nod1340]地铁环线
  4. msyql的子查询,或者叫嵌套查询
  5. PHP sha1()函数
  6. ACwing_789. 数的范围
  7. dell如何安装Win10/Ubuntu双系统
  8. nginx做反向代理时出现302错误
  9. 如何设置fvOptions【翻译】
  10. Cesium中常用的一些地理数据文件 以及数据相关的东西