zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    清除浮动的原理剖析
    修正IE6不支持position:fixed的bug(转)
    Callbacks vs Events
    垂直属性
    jQuery的事件模型
    Dean-Edward的事件系统实现
    简单的导航栏实现
    弹窗层效果的实现(非jQuery实现)
    rmdir
    mkdir
  • 原文地址:https://www.cnblogs.com/-9-8/p/8004264.html
Copyright © 2011-2022 走看看