Я пытаюсь реализовать подпись и проверку ключа RSA.
Я использую модульное возведение в степень, где я сталкиваюсь с ошибками, возможно, из-за целочисленного переполнения.
uint64_t modmult(uint64_t a,uint64_t b,uint64_t mod)
{
if (a == 0 || b < mod / a)
return ((uint64_t)a*b)%mod;
uint64_t sum;
sum = 0;
while(b>0)
{
if(b&1)
sum = (sum + a) % mod;
a = (2*a) % mod;
b>>=1;
}
return sum;
}
uint64_t modpow( uint64_t a,uint64_t b,uint64_t mod)
{
uint64_t product,pseq;
product=1;
pseq=a%mod;
while(b>0)
{
if(b&1)
product=modmult(product,pseq,mod);
pseq=modmult(pseq,pseq,mod);
b>>=1;
}
return product;
}
вызов функции
long long d = 2897297195663230443;
uint64_t n = 10136926879504331723;
modpow(1233,d,n);
n
- это кратное двух беззнаковых простых чисел uint32_t (4063800743,2494444861)
модульное возведение в степень
результат 3148683887780272464
, но должен быть 9640529604970470922
По сути, эта реализация не обрабатывает 64-целые беззнаковые значения n
скважина