Sidewalker
21-10-2012, 22:51
Часть реализации шифра.
В общем ТЗ: умножение по модулю 2^16+1 = 65537, причем вместо числа, равного нулю, используется 2^16.
Constants.decip_mod = 65537;
Constants.fyui = 65536;
Constants.one = 65535;
Как сделано в одном источнике (я не могу понять что к чему тут, разъясните пожалуйста полностью):
long p;
long q;
if(a==0) p = Constants.decip_mod - b;
else
if(b==0) p=Constants.decip_mod - a;
else {
q = a * b;
p = (q & Constants.one) - (q>>16); // & = битовое логическое умножение
if(p<=0) p = p + Constants.decip_mod;
}
return (long)(p&Constants.one);
Как делаю я:
if (a == 0) a = Constants.fuyi;
if (b == 0) b = Constants.fuyi;
p = ((a * b) % (Constants.decip_mod));
return p;
Что я делаю не так? (при использовании моего способа вся программа в итоге выдаёт неверный результат, при использовании первого - верный, НО на тестовых (написаны в описании алгоритма шифра) значениях a=2^16 и b=2^15 мой способ работает верно, впрочем как и первый способ - оба выдают 2^15+1).
И ещё: в одном месте находил этот исходник с парой комментариев, один из них был как раз к этой функции:
multiplication using the Low-High algorithm.
В общем ТЗ: умножение по модулю 2^16+1 = 65537, причем вместо числа, равного нулю, используется 2^16.
Constants.decip_mod = 65537;
Constants.fyui = 65536;
Constants.one = 65535;
Как сделано в одном источнике (я не могу понять что к чему тут, разъясните пожалуйста полностью):
long p;
long q;
if(a==0) p = Constants.decip_mod - b;
else
if(b==0) p=Constants.decip_mod - a;
else {
q = a * b;
p = (q & Constants.one) - (q>>16); // & = битовое логическое умножение
if(p<=0) p = p + Constants.decip_mod;
}
return (long)(p&Constants.one);
Как делаю я:
if (a == 0) a = Constants.fuyi;
if (b == 0) b = Constants.fuyi;
p = ((a * b) % (Constants.decip_mod));
return p;
Что я делаю не так? (при использовании моего способа вся программа в итоге выдаёт неверный результат, при использовании первого - верный, НО на тестовых (написаны в описании алгоритма шифра) значениях a=2^16 и b=2^15 мой способ работает верно, впрочем как и первый способ - оба выдают 2^15+1).
И ещё: в одном месте находил этот исходник с парой комментариев, один из них был как раз к этой функции:
multiplication using the Low-High algorithm.