Crypto ++ RSA и «недействительный шифровый текст»

StackOverflow https://stackoverflow.com/questions/1847410

  •  13-09-2019
  •  | 
  •  

Вопрос

Ну, я проходил свой личный ад в эти дни

У меня возникают проблемы, дешифрующие сообщение, которое было зашифровано с помощью RSA, и я всегда терпите неудачу с «RSA/OAEP-MGF1 (SHA-1): недействительный шифровый текст»

  1. У меня есть закрытый ключ, закодированный в Base64, и я загружаю его:

        RSA::PrivateKey private_key;
        StringSource file_pk(PK,true,new Base64Decoder);
        private_key.Load( file_pk );
    
  2. Затем я прихожу к декодированию сообщения, выполнив:

    RSAES_OAEP_SHA_Decryptor decryptor(private_key);
    
    AutoSeededRandomPool rng;
    
    string result;
    StringSource(ciphertext, true,
        new PK_DecryptorFilter(rng, decryptor,
            new StringSink(result)
        )
    );
    

Насколько я могу судить, сообщение должно быть проанализировано без каких -либо проблем. Ciphertext - это Std :: String, так что нет 0 в конце, которое могло бы сделать что -то неожиданное.

Я просто что -то, и что, если закрытый ключ неверен, но может быть загружен в любом случае, не бросая ошибку декодирования BER. Что это бросит, когда дешифтируется?

Надеюсь, что любой сможет пролить свет на это.

Ваше здоровье

Это было полезно?

Решение

Если ключ был фактически поврежден, функция нагрузки должна была потерпеть неудачу. Однако вы можете попросить ключ к самопротестированию, который должен обнаружить любую коррупцию, позвонив Validate, как:

bool key_ok = private_key.Validate(rng, 3);

Второй параметр (здесь, 3) указывает, сколько проверки необходимо пройти. Для RSA это приведет к тому, что он запустит все доступные тесты, даже медленные/дорогие.

Другая причина, по которой декодирование может потерпеть неудачу, заключается в том, что ключ просто не та, которая использовалась для шифрования исходного сообщения.

Очевидно, что вход шифрового текста должен быть полностью идентичен тому, что первоначально было создано на стороне шифрования. Для отладки одним из хороших способов проверить это было бы вписать шиферный текст с обеих сторон в хэш -функцию (конечно, удобно уже доступную) и сравнение выходов. Если вы HEX или BASE64 закодировали зашифрованный текст для передачи, вы должны отменить это, прежде чем отдать его DECRYPTOR RSA.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top