由于net/java 底层字节处理有差异会导致RSA非对称加解密通信联调不通的问题,记录一下,直接上代码
var pwd = new AsymmCrypt().EncryptByPublicKey(symm.Decrypt(edsPwd), rsaPublicKey); //rsa net->java
pwd = System.Net.WebUtility.UrlEncode(pwd); //服务端接收数据异常
var url = $"{tokenUrl.Trim('\\').Trim('/')}?userName={loginInfo.FItemNumber}&password={pwd}&t={DateTime.Now.Ticks}";
string tokenId = "";
using (var httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate }))
{
httpClient.DefaultRequestHeaders.Clear();
HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, new Uri(url));
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
var response = httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseContentRead).Result;
if (response.IsSuccessStatusCode)
/// <summary>/// 公钥加密/// </summary>/// <param name="data">加密内容</param>
/// <param name="publicKey">公钥(Base64编码后的)</param>
/// /// <returns>返回Base64内容</returns>
public string EncryptByPublicKey(string data, string publicKey)
{//非对称加密算法,加解密用
IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());//加密
try
{
engine.Init(true, GetPublicKeyParameter(publicKey)); byte[] byteData = Encoding_UTF8.GetBytes(data);
var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length); return Convert.ToBase64String(ResultData);
}
catch (Exception ex) { throw ex; }
}
private AsymmetricKeyParameter GetPublicKeyParameter(string keyBase64)
{
keyBase64 = keyBase64.Replace("\r", "").Replace("\n", "").Replace(" ", ""); byte[] publicInfoByte = Convert.FromBase64String(keyBase64);
Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入
AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);
return pubKey;
}
.net rsa加密->java 解密 1.//非对称加密算法,加解密用 using Org.BouncyCastle.Crypto; //使用第三方组件否则java服务端接收到的参数解释失败
IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());//加密2. pwd = System.Net.WebUtility.UrlEncode(pwd); //java服务端接收信息乱码 get url请求时