📜  pem文件字符串阅读器c#(1)

📅  最后修改于: 2023-12-03 14:45:07.203000             🧑  作者: Mango

PEM文件字符串阅读器C#

PEM文件是一种常见的编码格式,用于存储数字证书和其他一些加密信息。在C#中,我们可以使用System.Security.Cryptography命名空间中的X509Certificate2类来读取PEM文件。但是,X509Certificate2类只能处理证书文件,并不支持其他PEM格式的文件。

为此,我们可以自己实现一个PEM文件字符串阅读器,来解析PEM格式的文件。下面是一个基础版本的实现示例:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public static class PemReader
{
    private const string BEGIN_PRIVATE_KEY = "BEGIN PRIVATE KEY";
    private const string END_PRIVATE_KEY = "END PRIVATE KEY";

    private const string BEGIN_RSA_PRIVATE_KEY = "BEGIN RSA PRIVATE KEY";
    private const string END_RSA_PRIVATE_KEY = "END RSA PRIVATE KEY";

    public static RSA ReadPrivateKey(string pem)
    {
        if (!pem.StartsWith("-----BEGIN"))
        {
            throw new ArgumentException("Invalid PEM format");
        }

        if (pem.StartsWith($"-----{BEGIN_PRIVATE_KEY}-----") || pem.StartsWith($"-----{BEGIN_RSA_PRIVATE_KEY}-----"))
        {
            pem = ExtractData(pem);

            return RSA.Create();
        }
        else
        {
            throw new ArgumentException("Unsupported PEM format");
        }
    }

    private static string ExtractData(string pem)
    {
        var begin = pem.IndexOf("-----BEGIN");
        var end = pem.IndexOf("-----END");
        var length = end - begin;
        var base64 = pem.Substring(begin, length);

        return base64;
    }
}

这个阅读器支持两种类型的PEM格式:BEGIN PRIVATE KEYBEGIN RSA PRIVATE KEY。当传入的PEM文件不符合这两种格式时,将抛出异常。我们通过ExtractData方法来提取和返回PEM数据,然后使用RSA.Create()方法创建RSA实例,最后返回该实例。

使用示例:

var pem = "-----BEGIN PRIVATE KEY-----\n" +
          "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCt162AhbLgG8at\n" +
          "OKEm3KjQ2vZ8e5mt5bu5KzE5fhjpIvB8itseWkaG+cErTxexxK98KUD7YU6CNZU6\n" +
          "mQKw8qrJmGWHZA7aLKS0oZMrd9/POvh2Q1gdO3zbpOyTgTj1TRIjjE7oahxasRXl\n" +
          "fi2Ls33Bz+ppAbJytljT1gBfRtcocHrQQKj7ZU9W6+Ka7FsrEtGk2n7ybw8Mdl62\n" +
          "xnx0m+CHX8W5m5Kj16TV0OhgDwvNO8WpFXKdGG0lvBx4ko4AwXgwn1tNzRtjof/g\n" +
          "8g00QhM1ulqjCuaUb/hHLMtORroBlgZK8X4WqLG3qJf2kKjwaGYY55inCx5n5alz\n" +
          "vZ8K2n/hAgMBAAECggEAFaLnYMw8itK51nk1V7icd6KWeU6/kY+m6W65mVlKj6Bm\n" +
          "0c3K+wqxm1Qs0Zi7UAHI01oGOAa7NrlyxN1yTgTmfJr96jgL3sI2lLlZvsc9bLpT\n" +
          "x1T7TlkcWgU+d7VdCM+tpUk7ZuYDP6Ivd7VYO+VRMwxAeV1VDc2J0slLd5h5Zmvo\n" +
          "1ktEJOFcNKxPp7v/k8EWIRpNz//t708JH1bfKjXNyCT4fFlqD1JxQjKw/SGtwSjG\n" +
          "d5wpvISnwGnX8MKfIamVy5e+MvFnJ51MEldn927b+PrzRbvLl4tck4ufXEB3q/b3\n" +
          "ONlnfSHTfs8Nq/amzQgzjjN+spggFNcLX9djKp/6gQKBgQD+weOuH0VJlks6zef7\n" +
          "uYfJ0Moab6errHywVHXkgQ+GFBV7ee/Y6zefNSfm7pD6akYI6/cnC6KiKu/WwZXG\n" +
          "3FNsQ2zkcdHwa9ZfRA9XkegMLTXxRJlyTvgT43rB8Lju4OgKG/rtzZANri/CF4Ct\n" +
          "Q1lbmrwHjSpmfN5ZzB5m5fPG+wKBgQD8Xm0/kkxugFm5yPkhQt51m0JzC/6vmKU6\n" +
          "WIU6PxJKoWP7BMN6NQBoFwgbGKsE2ctLv3/DfP9XucIQheZ0mGUlyD7m+tTneAJr\n" +
          "kfQCzalwiZHt4b4iH19BlMqVy2BCGey3qS+cS23yWOXDt5b5f5Yu5FtzwxWK/rvZ\n" +
          "yoaq1l35lQKBgShyB/LYo5d5qc5f5GytXQIKvZ5WyxOpuBXOMBEgW58Eq8/07oTw\n" +
          "67CmHmX4lJt0ntG+Q3d3qPjS8w0yyfjdaQFU3e3JGrH9+ZqiLkyg/CzmjJ/momgy\n" +
          "TnTlJzC7VjKLu6uY7ZUHxfsJcEjUcu1wfG2wRs+I0zj+3qPT+vXAKHFBAoGAPJNG\n" +
          "04RW+dTgTJmFbNzmGB6jDY7VU9L6Uao7ZVEoVTM/BB+IQ56J1SRMwVdjhvw5FT5l\n" +
          "DTojvJxhvjCocE54bt8W5aBLwvPJIKRnCJLpXeW4exB4v2nTw1amq+vkbS8+mvLI\n" +
          "RiJzH4Y4ZcBl0Z4i0lLq3dJAMmPwhlDm0oE5bzkCgYBQ1M/ieKZSTncxun89C1ch\n" +
          "KvNknU6nymKjB7YU6cazlU6woKVE55IxnUjKk2fJ20HHFwE2Kifhn3bFtwOCcoY/\n" +
          "xRorIzb7rLrBXDHplk63DeOgUVQ7fh1/8KOI6wN/t6zCxU6BN94U6fqY1N7ZfyTJ\n" +
          "dLfWMLsiMaCSHmwLbp0fkA==\n" +
          "-----END PRIVATE KEY-----\n";

var rsa = PemReader.ReadPrivateKey(pem) as RSACryptoServiceProvider;

此示例将读取一个PEM格式的密钥,并返回RSA实例。在实际使用中,您可以根据需要扩展PemReader类,支持更多的PEM格式。