开发经历
最近在做一个RSA公钥加密项目,客户明确要求数据填充模式采用RSA/ECB/NoPadding,并提供参考的JAVA代码段。由于内部有成熟的其他模块C#接口方法,领导要求使用C#开发。
解决方案
1.使用客户提供的JAVA代码,然后“移植”到C#中,在研究发现调用Java代码/库需要使用IKVM,这玩意处理起来很繁琐,需要使用到很多支持库文件和安装很多插件以及配置很多环境变量,导致开发效率极低且移植性很差(换个电脑开发凉凉)。
2.继续使用C#开发,在查阅很多资料中发现C#同开发经历的项目答案很少,只有只言片语。终于在某个回答中提及到BouncyCastle,带着试试看的想法,测试使用了一下,发现还真的可以使用,特将该经历分享给大家。
使用前须添加BouncyCastle.Crypto.dll,该dll大小约2.5M,代码如下:
/// <summary>
/// 公钥加密
/// </summary>
/// <param name="clearText">加密字符串</param>
/// <param name="publicKey">公钥</param>
/// <returns>Base64字符串</returns>
public string RsaEncryptWithPublic(string clearText, string publicKey)
{
// analogue of Java:
// Cipher rsa = Cipher.getInstance("RSA/ECB/nopadding");
try
{
var bytesToEncrypt = Encoding.ASCII.GetBytes(clearText);
var encryptEngine = new RsaEngine(); // new Pkcs1Encoding (new RsaEngine());
using (var txtreader = new StringReader("-----BEGIN PUBLIC KEY-----\n" + publicKey + "\n-----END PUBLIC KEY-----"))
{
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
}
var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
return encrypted;
}
catch
{
return "";
}
}
``