| 本帖最后由 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;
 
 
 
 |