Encode/Decode 在 UWP 中使用非对称密钥
Encode/Decode in UWP using asymmetric keys
我正在尝试找出一种使用私钥加密字符串并使用 public 私钥解密的方法。我按照以下所述使用 OpenSSL 生成了密钥:
http://www.akadia.com/services/ssh_test_certificate.html
这是我目前拥有的
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 corrupted data
传递给该方法的字符串 key
具有以下格式:
var privateKey =
@"MIICXwIBAAKBgQDUTqfSknFiQx3aepORHJycWck007cfU4fXluTIyf6U9ipDhyPD
....
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 密钥解密时,使用以下类似方法;
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 ";
}
}
我收到一个 Method or operation not implemented
异常,可能还是有问题,或者 UWP 中还没有 private-encrypt/public-decrypt 方法。
我最后做的是获取 nuget 包 Portable.BouncyCastle-Signed
并遵循此答案中的代码片段:
效果很好。
我正在尝试找出一种使用私钥加密字符串并使用 public 私钥解密的方法。我按照以下所述使用 OpenSSL 生成了密钥:
http://www.akadia.com/services/ssh_test_certificate.html
这是我目前拥有的
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 corrupted data
传递给该方法的字符串 key
具有以下格式:
var privateKey =
@"MIICXwIBAAKBgQDUTqfSknFiQx3aepORHJycWck007cfU4fXluTIyf6U9ipDhyPD .... 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 密钥解密时,使用以下类似方法;
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 ";
}
}
我收到一个 Method or operation not implemented
异常,可能还是有问题,或者 UWP 中还没有 private-encrypt/public-decrypt 方法。
我最后做的是获取 nuget 包 Portable.BouncyCastle-Signed
并遵循此答案中的代码片段:
效果很好。