wangwei628 发表于 2022-2-10 11:47:50

本帖最后由 wangwei628 于 2022-2-10 11:56 编辑

算出来是对的

wai1216 发表于 2022-2-10 12:59:41

本帖最后由 wai1216 于 2022-2-10 18:15 编辑

wangwei628 发表于 2022-2-10 11:47
算出来是对的
有空写了个完整调用
仅供参考

      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;



wangwei628 发表于 2022-2-10 13:54:37

学习了,多谢表哥指点!

wgz001 发表于 2022-2-10 15:03:51

wai1216 发表于 2022-2-10 12:59
有空写了个完整调用
仅供参考



感觉离注册机又进了一大步

wangwei628 发表于 2022-2-10 17:15:53

wai1216 发表于 2022-2-10 12:59
有空写了个完整调用
仅供参考



试了一下,用软件里面的N,调用函数CryptoPP::Lucas计算出来的数据一样,但用自定义生成的N,和软件对不上,不知道哪里出问题了

wai1216 发表于 2022-2-10 18:12:28

wangwei628 发表于 2022-2-10 17:15
试了一下,用软件里面的N,调用函数CryptoPP::Lucas计算出来的数据一样,但用自定义生成的N,和软件对不 ...

大概你用的是10
10会比之前的版本加了点东西
可以玩下之前的版本以及对比下

wangwei628 发表于 2022-2-10 18:58:58

wai1216 发表于 2022-2-10 18:12
大概你用的是10
10会比之前的版本加了点东西
可以玩下之前的版本以及对比下

好的,多谢了

wai1216 发表于 2022-2-10 19:19:45

本帖最后由 wai1216 于 2022-2-10 19:36 编辑

wangwei628 发表于 2022-2-10 18:58
好的,多谢了
其实就是这
CODE:004A367B 0F B7 57 30                           movzx   edx, word ptr
CODE:004A367F 83 C2 02                              add   edx, 2
CODE:004A3682 83 EA 5D                              sub   edx, 5Dh
记软件中的n倒序后首地址为edi
= 0x5D
0x5D + 0x2 - 0x5D = 0x2

导致如果想通用 那么生成的n对应这位也要是0x5d
或者版本为10的时候 需要将这里也patch了

还有就是存放在代码段的n也是存在修正逻辑的

wangwei628 发表于 2022-2-10 19:38:55

wai1216 发表于 2022-2-10 19:19
其实就是这
CODE:004A367B 0F B7 57 30                           movzx   e ...

了解了,多谢表哥指点

wgz001 发表于 2022-2-10 21:00:49

wai1216 发表于 2022-2-10 19:19
其实就是这
CODE:004A367B 0F B7 57 30                           movzx   e ...

多谢表哥,知道了N在加密的过程中有校验,替换1字节N的加密的结果是一样的,再次感谢{:handshake:}
页: 1 [2] 3
查看完整版本: 这个函数怎么求逆运算,谢谢