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乘法中的循环边界增加两次,以便再执行两次循环迭代 我已经对一个工作算法做了

我很困惑,在模幂算法中使用模时,人们怎么可能绕过模的最后减法。以下两篇论文提出了绕过减法运算的条件

我不太清楚在“预处理和后处理”方面需要什么,以消除在蒙哥马利乘法结束时重复减去模的需要。

阅读上述论文后,我的理解是,要消除最后的减法运算,您必须:

  • 零将每个输入操作数扩展到模幂2

    e.g. new[2049 downto 0]  = (0, 0, old[2047 downto 0]) 
    
  • 将Montgomery乘法中的循环边界增加两次,以便再执行两次循环迭代
  • 我已经对一个工作算法做了这些修改,但是结果并不像我预期的那样,我不明白为什么因此,我认为我误解了这些论文中的某些内容,或者遗漏了一个关键步骤。

    让我们参考我的(工作)基数2蒙哥马利模幂函数(类C伪码)。请注意,我已将操作数宽度扩展了两个最高有效零位(只是为了确保没有溢出)。它们过去只有2048位

    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)模乘