netcore2.x下 RSA加解密错误:Operation is not supported on this platform.
标签:ace sam dem new car mit oid provider utf8
代码如下:经过测试,在netcore3.x正常,在netframework下也正常,就是netcore2.x报错。
///
/// RSA加密
///
///
///
///
public static string RSAEncrypt(string publickey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
return Convert.ToBase64String(cipherbytes);
}
///
/// RSA解密
///
///
///
///
public static string RSADecrypt(string privatekey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
return Encoding.UTF8.GetString(cipherbytes);
}
改为:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Xml;
namespace RSADemoNetCore2._1
{
public static class RSAHelper
{
private const string privateKey = "ulFAqzRA8HCGbw2rg1kPHmcI5dWC6Ive2HTzzq9kocAREBfZLEC7dcnTPjA6ChnfBg6MphSBwBonEIwntOAOyY5FoZSoFN+KyDrllWqKLmqZOg8Tvtf55UsTOs9h8atgzEIE5t+mp3FYMJRxv0w+pWyMs5bmELeGAoafUGlMLOU=AQAB5O8P2EogWjcxJJiNfv6u8i71cjsFhfP6h9O/hlXhOW87OljjeuXGa0wJnLdk63WnMcjk0i9z0Xl5GJ+5eni/Dw==
0FhbREKVOQTFfTpHIAhwu0/V6CJadCksEkrxyQJmgSGVygpbPqdCk/c9cMVOniPwKu+9qpUa0IZ2NORBMWiUyw==
ZhwW1iLh4TtCyQ7d9anFADJfuY6HvSKAOPsCLvm5FjP9l92zwMohwRPOKb9G3RrB8xumq/UMVH84uvnq8axPkw==b/z+WcucYECzUuOvdYVz6ws3xIYqrsOuv8pu+ogCxyhhVm+Iqj3HqLc93E8COjjBEKM7BOUOu8V65mVGsaMwTw==XMlElo7aJZrQu5YmA666ZvO9j98AxLeT9Abkc6xDHhJS5g90h1rEBoFfNEC+2Js7In7wmbcK/7KLqq5SURM/cA==sYYxw+6p4W6V6MJxpVj6GtG5nKPvc3ux/TSSCWD81VGX8GmIt62F8Bk5eYuiAXXdFnxObwAjENLaXd3tB15lNu3+ag/OpOKkRvk+8Qv399celFUDXyit59PbbBffHVkiEhULLpf+2QWB/3Bjk60Gb3uNaC4ptzSi5zYGYY91exE=";
private const string publicKey = "ulFAqzRA8HCGbw2rg1kPHmcI5dWC6Ive2HTzzq9kocAREBfZLEC7dcnTPjA6ChnfBg6MphSBwBonEIwntOAOyY5FoZSoFN+KyDrllWqKLmqZOg8Tvtf55UsTOs9h8atgzEIE5t+mp3FYMJRxv0w+pWyMs5bmELeGAoafUGlMLOU=AQAB";
public static byte[] Encrypt(byte[] encryptBytes, RSAEncryptionPadding padding)
{
using (var rsa = RSA.Create())
{
FromXmlString(rsa, publicKey);
var maxBlockSize = GetMaxBlockSize(rsa, padding);
if (encryptBytes.Length maxBlockSize)
{
var @bytes = rsa.Encrypt(encryptBytes, padding);
return @bytes;
}
using (var memoryStream = new MemoryStream(encryptBytes))
{
using (var readStream = new MemoryStream())
{
byte[] buffer = new byte[maxBlockSize];
int blockSize = memoryStream.Read(buffer, 0, maxBlockSize);
while (blockSize > 0)
{
var blockByte = new byte[blockSize];
Array.Copy(buffer, 0, blockByte, 0, blockSize);
var encrypts = rsa.Encrypt(blockByte, padding);
readStream.Write(encrypts, 0, encrypts.Length);
blockSize = memoryStream.Read(buffer, 0, maxBlockSize);
}
return readStream.ToArray();
}
}
}
}
public static byte[] Decrypt(byte[] decryptBytes, RSAEncryptionPadding padding)
{
using (var rsa = RSA.Create())
{
FromXmlString(rsa, privateKey);
var maxBlockSize = rsa.KeySize / 8;
if (decryptBytes.Length maxBlockSize)
{
var @bytes = rsa.Decrypt(decryptBytes, padding);
return @bytes;
}
using (var memoryStream = new MemoryStream(decryptBytes))
{
using (var readStream = new MemoryStream())
{
var buffer = new byte[maxBlockSize];
var blockSize = memoryStream.Read(buffer, 0, maxBlockSize);
while (blockSize > 0)
{
var blockByte = new byte[blockSize];
Array.Copy(buffer, 0, blockByte, 0, blockSize);
var decrypts = rsa.Decrypt(blockByte, padding);
readStream.Write(decrypts, 0, decrypts.Length);
blockSize = memoryStream.Read(buffer, 0, maxBlockSize);
}
return readStream.ToArray();
}
}
}
}
public static void FromXmlString(RSA rsa, string xmlString)
{
RSAParameters parameters = new RSAParameters();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
{
foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
switch (node.Name)
{
case "Modulus": parameters.Modulus = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Exponent": parameters.Exponent = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "P": parameters.P = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Q": parameters.Q = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DP": parameters.DP = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DQ": parameters.DQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "InverseQ": parameters.InverseQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "D": parameters.D = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
}
}
}
else
{
throw new Exception("Invalid XML RSA key.");
}
rsa.ImportParameters(parameters);
}
static int GetMaxBlockSize(RSA rsa, RSAEncryptionPadding padding)
{
var offset = 0;
if (padding.Mode == RSAEncryptionPaddingMode.Pkcs1)
{
offset = 11;
}
else
{
if (padding.Equals(RSAEncryptionPadding.OaepSHA1))
{
offset = 42;
}
if (padding.Equals(RSAEncryptionPadding.OaepSHA256))
{
offset = 66;
}
if (padding.Equals(RSAEncryptionPadding.OaepSHA384))
{
offset = 98;
}
if (padding.Equals(RSAEncryptionPadding.OaepSHA512))
{
offset = 130;
}
}
return rsa.KeySize / 8 - offset;
}
}
}
使用:
public static void Main(string[] args)
{
string encryptString = "需要加密的字符";
var encryptBytes = Encoding.UTF8.GetBytes(encryptString);
//加密后字节数组
var resultBytes = RSAHelper.Encrypt(encryptBytes, RSAEncryptionPadding.Pkcs1);
Console.WriteLine();
//解密后字节数组
var decryptBytes = RSAHelper.Decrypt(resultBytes, RSAEncryptionPadding.Pkcs1);
//解密结果
var result = Encoding.UTF8.GetString(decryptBytes);
//比较加密字符串和解密结果是否相等
Console.WriteLine(encryptString == result);
Console.ReadKey();
}
netcore2.x下 RSA加解密错误:Operation is not supported on this platform.
标签:ace sam dem new car mit oid provider utf8
原文地址:https://www.cnblogs.com/25miao/p/14303701.html
评论