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:}