Я хочу использовать private_key зашифровать некоторую строку
Обычно, когда вы просите шифруют с закрытым ключом, что вы хотите, этого вероятностной Подписи с Recovery (PSSR) схемой , Кстати, шифруют с закрытым ключом является не действительный криптографическое преобразование :)
cryptlib.h
header описывается как Абстрактные базовые классы, которые обеспечивают унифицированный интерфейс для этой библиотеки. Все Crypto ++ Signers и Verifiers придерживаются интерфейса PK_SignatureScheme
. Подписывающие устройства дополнительно реализуют PK_Signer
, а Verifiers дополнительно реализуют 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 ++ Рабин-Williams будет выглядеть следующим образом:
RWSS<PSSR, SHA256>::Signer signer;
RWSS<PSSR, SHA256>::Verifier verifier;
Объекты согласованы, и вы можете их менять.
Кстати, вы должны изучить Рабина-Уильямса, чтобы убедиться, что он соответствует вашим потребностям. Также см. Файл Bernstein's RSA signatures and Rabin–Williams signatures: the state of the art.
Я использую CryptoPP код для кодирования отлично работает ...
лома. Показатель, который вы используете, хорошо известен, поэтому нет никакой реальной безопасности в том, что вы делаете. Есть способы улучшить безопасность, но похоже, что вы хотите использовать PSSR.
Вот два примера использования PSSR RSA от вики:
А вот подписывающий код RSA Probabilistic Signature Scheme with Recovery с некоторыми из ваших вещей набрали. Обратите внимание, что вам нужен реальный 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 Probabilistic Signature Scheme with Recovery с некоторыми из ваших вещей набранных. Обратите внимание, что вам не нужно 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 Encryption Schemes на вики Crypto ++.
Как вы сделали здесь? Любые сюрпризы остаются? – jww