C# 使用非对称密钥的UWP编码/解码
我试图找到一种方法,用私钥加密字符串,用公钥解密。我使用OpenSSL生成密钥,如中所述: 这就是我目前拥有的C# 使用非对称密钥的UWP编码/解码,c#,uwp,win-universal-app,.net-core,windows-10-universal,C#,Uwp,Win Universal App,.net Core,Windows 10 Universal,我试图找到一种方法,用私钥加密字符串,用公钥解密。我使用OpenSSL生成密钥,如中所述: 这就是我目前拥有的 public static string Encrypt(string str, string key) { try { key = key.Replace(Environment.NewLine, ""); IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(k
public static string Encrypt(string str, string key)
{
try
{
key = key.Replace(Environment.NewLine, "");
IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);
AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null);
return CryptographicBuffer.EncodeToBase64String(encryptedData);
}
catch (Exception e)
{
throw;
return "Error in Encryption:With RSA ";
}
}
然而,在ImportPublicKey方法中,我得到了一个异常ASN1损坏数据
传递给该方法的字符串键
具有以下格式:
var privateKey =
@“MIICXWIBAAKBGQDUTQFSNFIQX3AEPORHJYCWK007CFU4FXLUTIYF6U9IPDHYPD
....
yDxwZVmexltyK5Bwc26lmb+5EtTEic+kZToYWcCucF8lsok=“
因此,OpenSSL生成的密钥文件的内容不包含此部分:
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
好的,所以我的代码是非常错误的,因为我想用私钥加密,但是使用了
ImportPublicKey
函数,正确的方法应该是
public static string Encrypt(string str, string key)
{
try
{
key = key.Replace(Environment.NewLine, "");
IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);
AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
var keyPar = provider.ImportKeyPair(keyBuffer, CryptographicPrivateKeyBlobType.Pkcs1RsaPrivateKey);
//CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
var encryptedData = CryptographicEngine.Encrypt(keyPar, dataBuffer, null);
var encryptedStr = CryptographicBuffer.EncodeToBase64String(encryptedData);
var signature = CryptographicEngine.Sign(keyPar, dataBuffer);
var signatureStr = CryptographicBuffer.EncodeToBase64String(signature);
return encryptedStr;
}
catch (Exception e)
{
throw;
return "Error in Encryption:With RSA ";
}
}
这可以使用RSA私钥对字符串进行加密
但是,当我尝试使用公钥解密时,使用以下类似的方法
public static string Decrypt(string str, string key)
{
try
{
key = key.Replace(Environment.NewLine, "");
IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(key);
AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaSignPkcs1Sha256);
CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(str));
var encryptedData = CryptographicEngine.Decrypt(publicKey, dataBuffer, null);
return CryptographicBuffer.EncodeToBase64String(encryptedData);
}
catch (Exception e)
{
throw;
return "Error in Decryption:With RSA ";
}
}
我得到了一个未实现的方法或操作
异常,要么仍然有问题,要么UWP中还没有私有加密/公共解密方法
我最后做的是让nuget软件包可移植。BouncyCastle签名
,并按照下面的答案中的代码片段进行操作:
像沙姆一样工作。请使用官方便携式版本的BouncyCastle,portable.BouncyCastle。我是便携式叉子的维护者。如果遇到问题,请在repo中打开问题:github.com/onovotny/bc-csharp