RSA

同余:给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即 (a-b)/m 得到一个整数,

    那么就称整数a b对模m同余,记做a ≡ b( mod n )

RSA算法的参数构成:

  1)选择两个大素数p、q;

  2)计算n,n = pq和n的欧拉定理的值,ψ(n) = (p-1)(q-1)

  3)随机选择公钥e,e只需要满足1<e<ψ(n),并且e和ψ(n)互素,(e, ψ(n)) = 1

  4)计算私钥d,满足ed ≡ 1( mod ψ(n))

公钥(e,n),私钥(d,n)

最基本的RSA算法,很容易受到选择密文攻击,所以一帮可以采用最佳对称加密填充(OAEP)来解决。

  这样就切断了攻击者,直接利用密文来测试明文的途径。

CRT,Chinese Remander Theorem是一种对模幂运算速度进行优化的算法。

在计算模幂的时候,可以分为两步:

1)CRT  keysetup

  input    p(first prime  modulus  factors),q(second  prime  modulus  factors),d(私钥 secret exponent)

  output dp,dq,qinv;

    流程:qinv = 1/q mod p;

       dp = d mod (p-1);

       dq = d mod (q-1);

2)CRT  Modular Exponent

  input   msg,  p,  q,  qinv,  dp,  dq

  output  c

    流程:mp = msg^p mod p;

       mq = msg^q mod q;

          i = mp^dp mod p;

          j = mq^dq mod q;

          j' = j mod p;

          k = (i - j') mod p;

          L = (k*qinv) mod p;

        s = L*q

        c = s+j

由于公钥e的一般范围都比较小,openssl的默认值是3-64之间,所以加密运算和signature,一般是不用crt加速的。

这样:公钥一般指:(n,e)

   私钥一般指:(n,d)  (p,q,dp,dq,qinv)

RSA的key_generation函数:包括1)选择公钥指数e,2)内部产生factors,p,q,n,3)计算私钥指数d

  input包括:

    1) k,length of modulus n in bits,(k = 1024+256s)

    2) e的长度,2<=e<=2k-160 (e的长度为零,表示内部自己randomize)

    3) hash function, random_seed,TRNG function

  output包括:

    1)公钥(n, e)

    2)私钥(n, d)以及(p,q,dp,dq,qinv)

公钥e一般可以使用固定值也可以使用随机值,

  固定值,一般包括2,3,17,217+1(65537)

  随机值一般要求,e的最高位和最低位都为1,并且,2<=e<2k-160 k为modulus n的bits

RSA的应用可以分为加解密primitives和签名验签primitives

  1) Encryption/Decryption primitives,

    RSAEP((n,e), m)

    输入:   (n,e) RSA公钥

        m    message,范围在0 - n-1之间,否则报错

    输出:c    ciphertext,范围在0 - n-1之间,

    步骤:1) 判断m的范围是否在0 - n-1之间,否则报错

       2) c = memod n

       3) 输出c

    RSADP(K,c)

    输入:K--------(n, d)

           (p,q,dp,dq,qinv)

       c    ciphertext,在0 - n-1之间

    输出:m    message,范围在0 - n-1之间

    步骤:crt_exp或mod_exp算法

  2)Signature/Verifiaction primitives,

    RSASP1(K, m)

    输入:  K---------一对密钥(n,d)

         ---------CRT的密钥序列(p,q,dp,dq,qinv)

         m   message介于0 - n-1之间

    输出:  s   signature介于0 - n-1之间

    步骤:   1)判断message的范围在0 - n-1之间,

        2)进行crt_exp, mod_exp的计算。

    RSAVP1((n,e), s)

    输入:   (n,e) RSA公钥

        s signature介于0 - n-1之间

    输出: m   message 基于0-n-1之间

    步骤:m = semodn

    在签名验签中必须保证密钥对是正确的。这是一个前提条件

在PKCS1的标准中:

encryption scheme可以分为RSAES-OAEP和RSAES-PKCS1-v1.5

  RSAES-OAEP的步骤:

    RSAES-OAEP-ENCRYPT

    

    1) 首先检查原始字符串的长度是否超过sha运算的最大支持长度;

      检查mLen的长度是否<= k -2hLen -2

    2) EME-OAEP encoding,产生EM(Encoding message)

      

      其中seed为随机数,lHash,不同的hash算法,初始值不同:

        

    3) RSA encryption primitive

    RSAES-OAEP-DECRYPT(K, C, L)步骤

     

    1)长度检查,原始字符串的长度必须小于SHA运算的最大值;

          如果密文C不是modulus的比特数,输出decryption error

          如果k < 2hLen + 2,输出decryption error

    2) RSA decryption

    3) EME-OAEP decoding

      

  RSAES-PKCS1-V1_5-Encrypt((n,e) M)

      Encryption步骤:

        

        1) length check,mLen > k-11

        2) EME_PKCS1-v1_5 encoding,

        3) RSA encryption

      Decryption步骤:

        

        1) length check,如果k<11或者C不是k bit长度

        2) RSA decryption

        3) EME-PKCS1-v1_5 decoding

Signature和Verification的流程有:RSASSA-PSS和RSASSA-PKCS1-v1_5

      PSS:RSASSA-PSS-SIGN(K, M)

        

        步骤:    EMSA-PSS encoding

             RSA signature

        RSASSA-PSS-VERIFY ((n,e), M, S)

        

        步骤:   Length checking

            RSA verification

            EMSA-PSS decoding

  RSASSA-PKCS1-v1_5只是encoding和decoding的方式不同。

具体的encoding方式,见http://www.cnblogs.com/-9-8/p/7997965.html  

RSA-X9.31 1998中的Signature和Verification流程:

    

verification流程:

    

    

关于RSA的一个很好的网页

https://www.di-mgt.com.au/rsa_alg.html

原文地址:https://www.cnblogs.com/-9-8/p/8004264.html