WinRT RSA加密从公钥指数/模数

本文关键字:指数 模数 公钥 RSA 加密 WinRT | 更新日期: 2023-09-27 18:19:05

我正在尝试将此方法从。net 4.5桌面应用程序移植到WinRT应用程序:

static byte[] DotNetRsaEncrypt(string modulus, string exponent, byte[] data)
{
    var modulusBytes = Convert.FromBase64String(modulus);
    var exponentBytes = Convert.FromBase64String(exponent);
    var rsaParameters = new RSAParameters { Modulus = modulusBytes, Exponent = exponentBytes };
    var rsa = new RSACryptoServiceProvider();
    rsa.ImportParameters(rsaParameters);
    var encrypted = rsa.Encrypt(data, true);
    return encrypted;
}

看完这个RSA加密在地铁风格的应用

我试了如下:

static byte[] WinRtRsaEncrypt(string modulus, string exponent, byte[] data)
{        
    var modulusBytes = Convert.FromBase64String(modulus);
    var exponentBytes = Convert.FromBase64String(exponent);
    var keyBlob = modulusBytes.Concat(exponentBytes).ToArray().AsBuffer();
    var rsa = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaOaepSha1);
    var key = rsa.ImportPublicKey(keyBlob, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
    var encrypted = CryptographicEngine.Encrypt(key, data.AsBuffer(), null);
    return encrypted;
}

但它不工作。

为了获得与桌面应用相同的功能…

  • 我应该把哪个AsymmetricAlgorithmNames传递给OpenAlgorithm()

  • 我应该把哪个CryptographicPublicKeyBlobType传递给ImportPublicKey()

WinRT RSA加密从公钥指数/模数

按照user1968335的提示,这对我有效。

首先,在c#应用程序中,使用以下代码从模数/指数中获取CspBlob:
var exponent = Encoding.Default.GetBytes(exponentStr);
var modulus = Encoding.Default.GetBytes(modulusStr);
var rsaParameters = new RSAParameters { Modulus = modulus, Exponent = exponent };
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);
var cspBlobString = Convert.ToBase64String(rsa.ExportCspBlob(false)); 

然后,在WinRT应用程序中,您可以使用CspBlob对数据块进行签名,如下所示:

private static string SignString(string data)
{
    string cspBlobString = //cspBlob
    var keyBlob = CryptographicBuffer.DecodeFromBase64String(cspBlobString);
    AsymmetricKeyAlgorithmProvider rsa = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
    CryptographicKey key = rsa.ImportPublicKey(keyBlob, CryptographicPublicKeyBlobType.Capi1PublicKey);
    IBuffer plainBuffer = CryptographicBuffer.ConvertStringToBinary(data, BinaryStringEncoding.Utf8);
    IBuffer encryptedBuffer = CryptographicEngine.Encrypt(key, plainBuffer, null);
    byte[] encryptedBytes;
    CryptographicBuffer.CopyToByteArray(encryptedBuffer, out encryptedBytes);
    return Convert.ToBase64String(encryptedBytes);
}

如果重要的话,下面是我生成非对称密钥的方式:http://43n141e.blogspot.co.uk/2008/08/rsa-encryption-openssl-to-ruby-to-c-and_27.html

根据CryptoWinRT示例,OpenAlgorithm(...)方法获取这些值。

  • RSA_PKCS1
  • RSA_OAEP_SHA1
  • RSA_OAEP_SHA256
  • RSA_OAEP_SHA384

参见:WinRT和。net应用程序之间的RSA加密