4

公開鍵モジュラスと公開鍵指数があり、メトロ スタイル アプリケーションで公開鍵を生成してデータを暗号化する必要があります。c# には RSAParameters クラスがありますが、メトロ スタイルのアプリケーションにそのようなものは見つかりません。

証明書から直接受け取った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);
4

2 に答える 2

2

Yourkeyは、長さが128の公開鍵のモジュラス部分です。メトロの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;          
}
于 2012-10-30T07:25:07.373 に答える
0

これはあなたが求めていることをするはずです:

public static IBuffer RsaEncrypt(byte[] modulus, byte[] exponent, IBuffer data)
{
  var rsa = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaOaepSha1);
  var keyBlob = modulus.Concat(exponent).ToArray().AsBuffer();
  var publicKey = rsa.ImportPublicKey(keyBlob, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);
  return CryptographicEngine.Encrypt(publicKey, data, null);
}

もちろん、必要に応じて base64 文字列を入力/出力として使用することもできますが、その方法は既に知っています。:)

RFC3447の 61 ページを掘り下げると、公開鍵形式の構造がモジュラスの後に指数が続くだけであることがわかります。これが、それらを連結した理由です。

于 2012-11-03T04:31:04.760 に答える