本帖最后由 wai1216 于 2022-2-10 18:15 编辑
有空写了个完整调用
仅供参考
[Plain Text] 纯文本查看 复制代码 class LUCPrimeSelector : public CryptoPP::PrimeSelector {
public:
LUCPrimeSelector(const CryptoPP::Integer& e) : m_e(e) {}
bool IsAcceptable(const CryptoPP::Integer& candidate) const
{
return CryptoPP::RelativelyPrime(m_e, candidate + 1) && CryptoPP::RelativelyPrime(m_e, candidate - 1);
}
CryptoPP::Integer m_e;
};
// CryptoPP::Test::SetGlobalSeed(argc, argv, CryptoPP::Test::s_globalSeed);
// CryptoPP::SymmetricCipher& cipher = dynamic_cast<CryptoPP::SymmetricCipher&>(CryptoPP::Test::GlobalRNG());
// cipher.SetKeyWithIV((CryptoPP::byte*)CryptoPP::Test::s_globalSeed.data(), CryptoPP::Test::s_globalSeed.size(), (CryptoPP::byte*)CryptoPP::Test::s_globalSeed.data());
CryptoPP::AutoSeededRandomPool prng;
CryptoPP::Integer luc_e("0x10001");
int modulusSize = 832;
LUCPrimeSelector selector(luc_e);
CryptoPP::Integer luc_p;
CryptoPP::Integer luc_q;
CryptoPP::AlgorithmParameters primeParam = CryptoPP::MakeParametersForTwoPrimesOfEqualSize(modulusSize)
("PointerToPrimeSelector", selector.GetSelectorPointer());
luc_p.GenerateRandom(prng, primeParam);
luc_q.GenerateRandom(prng, primeParam);
CryptoPP::Integer luc_n = luc_p * luc_q;
CryptoPP::Integer luc_u = luc_q.InverseMod(luc_p);
std::cout << "luc_p:" << std::endl;
std::cout << std::hex << luc_p << std::endl;
std::cout << "luc_q:" << std::endl;
std::cout << std::hex << luc_q << std::endl;
std::cout << "luc_n:" << std::endl;
std::cout << std::hex << luc_n << std::endl;
std::cout << "luc_u:" << std::endl;
std::cout << std::hex << luc_u << std::endl;
CryptoPP::Integer msg("0x4f6742f0b939f6e3951f4bee116533c196ae3b69a824b7cd418b0d25e0b3b03c3016e4394a771398f677a24f17565f3a46c7115c1e944e104c770a3182b79ff98a5eaf2cfdd88b75acd96380586e00677307c31e9db4fd42b795c8b51ea975ccec9a5968c84ede0e");
std::cout << "msg:" << std::endl;
std::cout << std::hex << msg << std::endl;
CryptoPP::Integer msg_v = CryptoPP::Lucas(luc_e, msg, luc_n);
std::cout << "Lucas:" << std::endl;
std::cout << std::hex << msg_v << std::endl;
CryptoPP::Integer msg_iv = CryptoPP::InverseLucas(luc_e, msg_v, luc_q, luc_p, luc_u);
std::cout << "InverseLucas:" << std::endl;
std::cout << std::hex << msg_iv << std::endl;
|