Cryptography RSA密码系统montgomery模乘中的最终减法
我很困惑,在模幂算法中使用模时,人们怎么可能绕过模的最后减法。以下两篇论文提出了绕过减法运算的条件Cryptography RSA密码系统montgomery模乘中的最终减法,cryptography,rsa,public-key-encryption,modular-arithmetic,montgomery-multiplication,Cryptography,Rsa,Public Key Encryption,Modular Arithmetic,Montgomery Multiplication,我很困惑,在模幂算法中使用模时,人们怎么可能绕过模的最后减法。以下两篇论文提出了绕过减法运算的条件 我不太清楚在“预处理和后处理”方面需要什么,以消除在蒙哥马利乘法结束时重复减去模的需要。 阅读上述论文后,我的理解是,要消除最后的减法运算,您必须: 零将每个输入操作数扩展到模幂2 e.g. new[2049 downto 0] = (0, 0, old[2047 downto 0]) 将Montgomery乘法中的循环边界增加两次,以便再执行两次循环迭代 我已经对一个工作算法做了
e.g. new[2049 downto 0] = (0, 0, old[2047 downto 0])
let NUM_BITS = 2048
let rsaSize_t be a 2050-bit vector type
// Montgomery multiplication: outData = XYr^(-1) modulo M,
// where the radix r=2^n (n=NUM_BITS)
function montMult( rsaSize_t X, // Multiplier
rsaSize_t Y, // Multiplicand
rsaSize_t M, // Modulus
rsaSize_t outData) // Result
{
rsaSize_t S = 0; // Running sum
for (i=0; i<NUM_BITS; i++)
{
if (X.bit(i)==1) // Check ith bit of X
S += Y;
if (S.bit(0)==1) // check LSB of S
S += M;
S = S >> 1; // Rightshift 1 bit
}
// HERE IS THE FINAL SUBTRACTION I WANT (NEED) TO AVOID
if (S >= M)
{
S -= M;
}
outData = S.range(NUM_BITS-1,0);
}
// montgomery modular exponentiation using square and multiply algorithm
// computes M^e modulo n, where we precompute the transformation of the
// base and running-partial sum into the montgomery domain
function rsaModExp( rsaSize_t e, // exponent
rsaSize_t n, // modulus
rsaSize_t Mbar, // precomputed: montgomery residue of the base w.r.t. the radix--> (2^2048)*base mod n
rsaSize_t xbar, // precomputed: montgomery residue of 1 w.r.t. the radix--> 2^2048 mod n
rsaSize_t *out) // result
{
for (i=NUM_BITS-1; i>=0; i--)
{
montMult(xbar, xbar, n, xbar); // square
if (e.bit(i)==1)
montMult(Mbar, xbar, n, xbar); // multiply
}
// undo montgomery transform
montMult(xbar, 1, n, out);
}
让NUM_位=2048
设rsaSize\t为2050位向量类型
//蒙哥马利乘法:outData=XYr^(-1)模M,
//其中基数r=2^n(n=NUM_位)
函数montMult(rsaSize\u t X,//乘法器
rsaSize\u t Y,//被乘数
rsaSize\u t M,//模数
rsaSize\u t outData)//结果
{
rsaSize\u t S=0;//运行总和
对于(i=0;i>1;//右移1位
}
//这是我想要(需要)避免的最后一个减法
如果(S>=M)
{
S-=M;
}
outData=S.范围(NUM_位-1,0);
}
//使用平方乘算法的montgomery模幂运算
//计算M^e模n,其中我们预计算
//基本和运行部分和到蒙哥马利域
函数rsaModExp(rsaSize\u t e,//指数
rsaSize\u t n,//模数
rsaSize_t Mbar,//预计算:基w.r.t.基数的蒙哥马利剩余-->(2^2048)*基模n
rsaSize_t xbar,//预计算:1 w.r.t.基数的蒙哥马利剩余-->2^2048 mod n
rsaSize\u t*out)//结果
{
对于(i=NUM_BITS-1;i>=0;i--)
{
蒙穆特(xbar,xbar,n,xbar);//正方形
如果(e.位(i)==1)
蒙穆特(毫巴,兆巴,兆巴);//乘法
}
//撤消蒙哥马利变换
蒙穆特(xbar,1,n,out);
}
我是否在论文中遗漏了什么?我不认为这是一个实现错误,因为我的代码与论文中提出的完全匹配。我相信我可能是一个概念错误。感谢所有帮助
谢谢!不确定您的非工作实现有什么问题(如果我理解得很好,您展示的是一个工作实现)。为了使用Walter优化计算
M^e mod n
,如果您的数字都适合2048位,您需要:
let NUM_BITS = 2050 // 2048 + 2
n < 2^(NUM_BITS - 2) // precondition
M < 2 * n // precondition
let R = 2^(2 * NUM_BITS) mod n // pre-computed once for all
let M' = montMult(M, R, n) // bring M in Montgomery form
let C' = montExp(M', e, n) // Montgomery exponentiation
let C = montMult(C', 1, n) // bring C' in normal form
NUM_BITS=2050//2048+2
n<2^(NUM_位-2)//前置条件
M<2*n//
设R=2^(2*NUM_位)mod n//预先计算一次
设M'=montMult(M,R,n)//使M为蒙哥马利形式
设C'=montExp(M',e,n)//Montgomery求幂
设C=montMult(C',1,n)//使C'为正规形式
最重要的:不要忘记检查前提条件
蒙哥马利乘法包括NUM_位
(在您的例子中是2050)迭代(if-A-bit-set-add-B,if-odd-add-n,div-by-two),最低有效位优先,所有数字都表示在NUM_位
(在您的例子中是2050)位上
蒙哥马利求幂法还包括
NUM\u BITS
(在你的例子中是2050)迭代(square,if-e-bit-set-mult),最高有效位优先,所有数字都表示在NUM\u BITS
(在你的例子中是2050)位上。希望它能有所帮助。就是这样。问题是我在计算R(或蒙哥马利标准术语中的R^2)使用2048,但在2050年迭代。事实上,我最后尝试了2050的NUM_位,一切都成功了!谢谢。还有一个问题……在较高基数的情况下,每个操作数都被拆分为字,NUM_位是否仍然相同,因为总操作数宽度没有改变?例如,我想在中拆分2048位操作数对于17位字,因为FPGA有这样的17位宽乘法累加器()。如果我改为运行额外17位(额外字)的循环并使R=2^(2*NUM_位)mod n,其中NUM_位=17位*121words,walter优化是否仍然有效?我询问它是否仍然有效,因为这一更改破坏了我的实现:)即使您使用了超过2个额外的位,Walter优化也应该可以工作。我怀疑您的问题与进位的错误传播或其他类似错误有关。在升级到模乘然后求幂之前,交叉检查您的加法是否仍然有效。顺便提一下,Xilinx FPGA中的DSP48E1块包含一个48位加法器,而不是17位(见图)。当你使用FPGA时,它比微处理器的主要优点是它的并行级别,你是否考虑过使用超宽(2050位)来携带保存加法器代替DSP块的可能性?如果您有足够的可用资源(主要是D触发器),这将允许您仅在一个时钟周期内,以大约相同的时钟频率计算模乘的每次迭代…1)模乘