Я хочу использовать private_key для шифрования некоторой строки
Обычно, когда вы запрашиваете шифрование закрытым ключом, вам нужна схема вероятностной подписи с восстановлением (PSSR). Между прочим, зашифровать закрытым ключом не допустимое криптографическое преобразование :)
cryptlib.h
header описывается как Абстрактные базовые классы, обеспечивающие единый интерфейс. в эту библиотеку. Все подписанты и верификаторы Crypto++ придерживаются интерфейса PK_SignatureScheme
. Подписывающие дополнительно реализуют PK_Signer
, а верификаторы дополнительно реализуют PK_Verifier
.
Объекты Crypto++ RSA будут выглядеть так:
RSASS<PSSR, SHA256>::Signer signer;
RSASS<PSSR, SHA256>::Verifier verifier;
Объекты Crypto++ Рабина будут выглядеть так:
RabinSS<PSSR, SHA256>::Signer signer;
RabinSS<PSSR, SHA256>::Verifier verifier;
Объекты Crypto++ Rabin-Williams будут выглядеть так:
RWSS<PSSR, SHA256>::Signer signer;
RWSS<PSSR, SHA256>::Verifier verifier;
объекты согласованы, и вы можете менять их местами.
Кстати, вы должны изучить Rabin-Williams, чтобы увидеть, соответствует ли он вашим потребностям. См. также подписи RSA и подписи Рабина-Вильямса: современное состояние Бернштейна.
Я использую КриптоПП, код для кодирования работает нормально...
Утилизируйте это. Экспонента, которую вы используете, хорошо известна, поэтому нет никакой реальной безопасности в том, что вы делаете. Есть способы улучшить безопасность, но похоже, что вместо этого вам нужен PSSR.
Вот два примера использования PSSR RSA из вики:
А вот код подписавшего для вероятностной схемы подписи RSA с восстановлением с некоторыми вашими данными. . Обратите внимание, что вам нужен настоящий RandomNumberGenerator
, поскольку подпись рандомизирована.
Integer n(...), e(...), d(...);
RSA::PrivateKey key(n,e,d);
RSASS<PSSR, SHA256>::Signer signer(key);
////////////////////////////////////////////////
// Sign and Encode
SecByteBlock signature(signer.MaxSignatureLength(messageLen));
AutoSeededRandomPool rng;
size_t signatureLen = signer.SignMessageWithRecovery(rng, message, messageLen, NULL, 0, signature);
// Resize now we know the true size of the signature
signature.resize(signatureLen);
А вот код проверки для вероятностной схемы подписи RSA с восстановлением с некоторыми вашими данными. . Обратите внимание, что вам не нужен RandomNumberGenerator
, поэтому вы можете использовать NullRNG()
, если он где-то нужен.
Integer n(...), e(...);
RSA::PublicKey key(n,e);
RSASS<PSSR, SHA256>::Verifier verifier(key);
////////////////////////////////////////////////
// Verify and Recover
SecByteBlock recovered(
verifier.MaxRecoverableLengthFromSignatureLength(signatureLen)
);
DecodingResult result = verifier.RecoverMessage(recovered, NULL, 0, signature, signatureLen);
if (!result.isValidCoding) {
throw Exception(Exception::OTHER_ERROR, "Invalid Signature");
}
////////////////////////////////////////////////
// Use recovered message
// MaxSignatureLength is likely larger than messageLength
recovered.resize(result.messageLength);
... но код расшифровки выдает исключение: "класс CryptoPP::InvertibleRSAFunction: отсутствует обязательный параметр "Prime1""
Да, зашифровать закрытым ключом не допустимое криптографическое преобразование. Я почти уверен, что расшифровать с помощью открытого ключа также недействительно :)
Я не буду приводить код для шифрования и дешифрования, так как не верю, что он вам нужен. Но вы можете найти его в разделе Схемы шифрования RSA на вики Crypto++.
person
jww
schedule
14.06.2016