我有公钥模数和公钥指数,我需要生成公钥并在 Metro 风格应用程序中加密数据。在 C# 中,我们有 RSAParameters 类,但我找不到任何适用于 Metro 风格应用程序的此类内容。
当我使用直接从证书接收的 base64 编码的公钥并尝试使用以下代码导入密钥时,我收到抛出异常 ASN1 bad tag value met 。
我认为这是由于数据格式无效造成的。
//sample dummy key from certificate in base64encoded
string key = @"MIIB0zCCAX2gAwIBAgIJAMF/bHcA799IMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTIwMzI3MTEyNjQ5WhcNMTMwMzI3MTEyNjQ5WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMEPeWjP4sdqxvBlDId4BtRRTeWPwjlZLSOFvOVgmoSyoPva8psFUF6tH9/vPXIJrL80tdCoBt8YFH6pwDN9a1sCAwEAAaNQME4wHQYDVR0OBBYEFGARqQfUhX7atVU4sS+aQAPt/jFxMB8GA1UdIwQYMBaAFGARqQfUhX7atVU4sS+aQAPt/jFxMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADQQALqOyjovRbWUZvziVaE8QYy83WEln1l+HJU9D6tFncUZTlwSd8aUwyQsd3zOVNZ41oCAVv5R3h1jtBtPbM+c1K";
symmetricKeyAlgorithmProvider asymmAlg = AsymmetricKeyAlgorithmProvider.OpenAlgorithm("RSA_OAEP_SHA1");
CryptographicKey publicKey = asymmAlg.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(key));
string input64string ="encrypt this";
IBuffer dataToEncrypt = CryptographicBuffer.DecodeFromBase64String(input64string);
IBuffer encryptedData = CryptographicEngine.Encrypt(publicKey, dataToEncrypt, null);
Your key
是公钥的模数部分,其长度为128。考虑从metro中的C#代码导出的标准密钥:
using System.Runtime.InteropServices.WindowsRuntime;
CryptographicKey standardKeyPair = provider.CreateKeyPair(1024);
byte[] standardKey = standardKeyPair.ExportPublicKey(CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey).ToArray();
可以看到byte[] standardKey的长度是140,有7位前缀和5位尾部。我不知道原因,但我将额外的 12 位复制到已知密钥中,它有效。希望这对您有帮助:
public static IBuffer RsaEncrypt(this IBuffer dataToEncrypt, string publicKeyN)
{
AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
CryptographicKey standardKeyPair = provider.CreateKeyPair(1024);
byte[] standardKey = standardKeyPair.ExportPublicKey(CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey).ToArray();
var data_n = CryptographicBuffer.DecodeFromBase64String(publicKeyN).ToArray();
Array.Copy(data_n, 0, standardKey, 7, data_n.Length);
var key = provider.ImportPublicKey(standardKey.AsBuffer(), CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
var result = CryptographicEngine.Encrypt(key, dataToEncrypt, null);
return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)