Устройство чтения pem с надувным замком выдает исключение при чтении открытого ключа

#c# #encryption #rsa #bouncycastle

#c# #шифрование #rsa #BouncyCastle

Вопрос:

Я пытаюсь зашифровать сообщение на C # (в Unity) с помощью открытого ключа. Для этого я использую библиотеку Bouncy Castle. Я получаю сообщение об ошибке при попытке прочитать открытый ключ с помощью считывателя pem bouncy castle. Я взял этот код отсюда. Конкретная ошибка, которую я получаю, это:

ArgumentException: illegal object in GetInstance: Org.BouncyCastle.Asn1.Dersequence

Вот код:

      static string encrypt(string plainText) {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        PemReader pr = new PemReader(
            new StringReader(m_publicKey)
        );
        RsaKeyParameters keys = (RsaKeyParameters)pr.ReadObject();

        OaepEncoding eng = new OaepEncoding(new RsaEngine());
        eng.Init(true, keys);

        int length = plainTextBytes.Length;
        int blockSize = eng.GetInputBlockSize();
        List<byte> cipherTextBytes = new List<byte>();
        for (int chunkPosition = 0;
            chunkPosition < length;
            chunkPosition  = blockSize)
        {
            int chunkSize = Math.Min(blockSize, length - chunkPosition);
            cipherTextBytes.AddRange(eng.ProcessBlock(
                plainTextBytes, chunkPosition, chunkSize
            ));
        }
        return Convert.ToBase64String(cipherTextBytes.ToArray());
    }
  

Ошибка возникает при создании экземпляра устройства чтения pem. существует небольшая разница в моем коде и приведенном примере кода (я использую StringReader вместо чтения из файла), но я получаю ту же ошибку, если я читаю из файла. У кого-нибудь есть какие-нибудь идеи?

Ответ №1:

Хорошо, я надеюсь, что это поможет всем, кто совершает эту глупую ошибку. Мой открытый ключ имел формат:

 -----END RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
  

По-видимому, этот формат не принят.

после удаления «RSA» из верхнего и нижнего колонтитулов он смог загрузить открытый ключ.

РЕДАКТИРОВАТЬ: если кому-то полезно, ключ был сгенерирован пакетом crypto / rsa go. (Функция GenerateKey)

Комментарии:

1. Изменение заголовка никоим образом не изменяет формат ключа.

2. Я имею в виду, скажите это bouncy castle. Когда я удалил «RSA», это сработало. Когда «RSA» все еще было в заголовке, это не сработало.

3. Вы никогда не объясняли, откуда взялся ключ и как он оказался в этом формате.

4. Справедливое замечание, и я отредактирую для ясности, но это все равно означает, что формат заголовка имеет значение для bouncy castle.

5. Да, поскольку Bouncycastle не пробует все возможные форматы, пока не найдет подходящий, он использует заголовок как подсказку к формату. Если вы введете неправильный заголовок, Bouncycastle попытается проанализировать его в соответствии с этой неверной подсказкой и потерпит неудачу. BEGIN RSA PUBLIC KEY подразумевает заголовок pkcs # 1, специфичный для RSA. BEGIN PUBLIC KEY подразумевает заголовок RFC 5280 SubjectPublicKeyInfo, который работает для других типов открытых ключей, а также для RSA.