我想用 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++ Rabin 对象如下所示:
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,看看它是否符合您的需求。另请参阅 Bernstein 的 RSA signatures and Rabin–Williams signatures: the state of the art。
我正在使用 CryptoPP,编码的代码可以正常工作...
报废它。您使用的指数是众所周知的,因此您所做的事情没有真正的安全性。有一些方法可以提高安全性,但听起来你想要一个 PSSR。
以下是 wiki 中使用 RSA 的 PSSR 的两个示例:
这是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);
...但是解密代码抛出异常:“class CryptoPP::InvertibleRSAFunction: Missing required parameter 'Prime1'”
是的,用私钥加密是不是有效的加密转换。我很确定用公钥解密是不是有效的,要么:)
我不打算提供加密和解密的代码,因为我认为你不需要它。但是你可以在 Crypto++ wiki 上的 RSA Encryption Schemes 找到它。