RSA -原理介绍

学习笔记:

1、 先来看 RSA原理

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。

 主要的数学原理介绍如下:

图解|什么是RSA算法_吴师兄学算法的博客-CSDN博客

欧拉函数:任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?

欧拉函数有个通用的计算公式:

a. 如果k是质数,则φ(k) = k-1;
b.如果 n = P * Q,P 与 Q 均为质数,则 φ(n) = φ(P * Q)= φ(P)φ(Q) = (P - 1)(Q - 1) 

欧拉定理
如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。
m^{\phi \left ( n \right )} \mod\ n\equiv 1

费马小定理
欧拉定理的特殊情况:如果两个正整数m和n互质,而且n为质数,那么φ(n)结果就是n-1
m^{n-1}\mod\ n \equiv 1

根据欧拉定理进行下面公式转换

(注:上面X等于φ(N)时候,式子5的推论成立)

 因此,根据以上数学原理,RSA的私钥和公钥的产生过程如下:

RSA加密原理

  • 1.随机选择两个质数P和Q(n=P*Q)

  • 2.求N的欧拉函数值M(也就是φ(N)

  • 3.找一个与M互素的整数E

  • 4.找一个整数D,满足如下关系:(E*D) mod M = 1(这里有一个术语-模逆元或模反,也就是指有一个整数d,可以使得ed被φ(N)除的余数为1。)

  • 通过随机选择的互质的P和Q计算得到N、M、E、D

  • 这些数字分为两组:(E,N)和(D,N)分别为公钥组和私钥组,E是公钥、D是私钥

  • 图解|什么是RSA算法_吴师兄学算法的博客-CSDN博客

  • RSA的加密过程满足:

    X^E mod N = Y
    其中X为明文,E为公钥,N为大整数,Y为密文,mod取余运算。(注意:数字X需要小于密钥组中的N,如果字符串转换后的数字X后大于N则需要先进行拆分)

    解密过程:

    Y^D mod N = X
    其中Y为密文,D为私钥,N为大整数,X为明文,mod取余运算。(由欧拉定理和模逆可推出)

    RSA的安全性:

    除了公钥用到ne,其余的4个数字是不公开的(p、q、φ(n)、d)
    目前破解RSA得到的方式如下:

    要想求出私钥d,由于ed=φ(n)k+1,要知道eφ(n);e是知道的,但是要得到φ(n),必须知道pq;由于n=p*q,只有将n因式分解才能算出

    大整数的因数分解是极其困难的,属于NPC问题,所以RSA算法的安全性取决于大整数分解的难度,目前RSA算法可以支持4096位密钥长度,分解难度超乎想象,即使借助于量子计算机难度和时间都是非常非常大的。

  • 2  OpenSSL产生key文件:

  • RSA公私钥格式分析及其在Java和Openssl之间的转换方法_元子丰的博客-CSDN博客_rsa私钥格式

  • 生成私钥:openssl genrsa -out prikey.pem 1024

    上面这条命令可以生成一个PKCS#1格式的,PEM格式(Base64编码+DER编码)的,1024位的RSA私钥;

    RSA公钥

     从私钥中导出公钥:

    openssl rsa –in prikey.pem –RSAPublicKey_out –out pubkey.pkcs1.pem

    这条命令可以从RSA私钥中PKCS#1格式的、PEM编码的RSA公钥

    RSA公钥

    PKCS#1格式的RSA公钥

    PKCS#1格式的RSA公钥的ASN.1描述如下:

    RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n

                                                         publicExponent INTEGER -- e }

  • modulus: 是RSA模数,是一个正整数
  • publicExponent: 是RSA公钥幂指数,是一个正整数
  • 我们用Asn1View来查看一下前面生成的pubkey.pkcs1.pem这个RSA公钥:

  • PKCS#1格式的RSA公钥

    可以看到,它是符合PKCS标准的。其中包括了n和e这两个RSA公钥元素。其中e为65537,即0x10001,这是一个最常用的公钥幂指数。
    RSA算法中的公钥指数目前在用的有两个,其一名为F0,等于3;其二名为F4,等于65537。
  • PKCS#1格式的RSA私钥

    • RSAPrivateKey ::= SEQUENCE {
          version           Version, 
          modulus           INTEGER,  -- n
          publicExponent    INTEGER,  -- e
          privateExponent   INTEGER,  -- d
          prime1            INTEGER,  -- p
          prime2            INTEGER,  -- q
          exponent1         INTEGER,  -- d mod (p-1)
          exponent2         INTEGER,  -- d mod (q-1) 
          coefficient       INTEGER,  -- (inverse of q) mod p
          otherPrimeInfos   OtherPrimeInfos OPTIONAL 
      }

    • 另外还有PKCS#8格式的RSA私钥和公钥,具体信息可以查看X509文档;

  •  

     

     

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RSA-CRT(RSA Chinese Remainder Theorem)是一种用于快速计算RSA加密和解密的技术。它利用了中国剩余定理的性质,使得RSA的运算速度得到了大大提升。 下面是一段精简的RSA-CRT代码: ```python from math import gcd def egcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = egcd(b % a, a) return (g, x - (b // a) * y, y) def modinv(a, m): g, x, y = egcd(a, m) if g != 1: raise Exception('modular inverse does not exist') else: return x % m def rsa_crt(c, dp, dq, p, q): qinv = modinv(q, p) m1 = pow(c, dp, p) m2 = pow(c, dq, q) h = (qinv * (m1 - m2)) % p return (m2 + h * q) % (p * q) # Test c = 12345 dp = 67890 dq = 12345 p = 98765 q = 54321 m = rsa_crt(c, dp, dq, p, q) print(m) ``` 在这段代码中,我们使用了扩展欧几里得算法(extended Euclidean algorithm)来求解逆元,然后使用中国剩余定理的性质来快速计算RSA加密和解密。 希望这些内容能够帮助您理解RSA-CRT的原理和实现方式。 ### 回答2: RSA-CRT是一种用于加密和解密数据的公钥密码算法,它在加密和解密的过程中涉及到两个主要计算操作:模幂运算和模乘运算。 为了提高RSA-CRT算法的效率,可以进行代码精简和优化。下面是一些可能的方法: 1. **使用适当的数据结构:** 在实现RSA-CRT算法时,可以使用合适的数据结构来存储和处理大数运算,如使用数组或链表来表示大整数。 2. **利用模幂运算的特性:** 在模幂运算中,可以利用一些数学性质来减少计算量。例如,可以使用二进制模幂算法来加速计算,而不是简单地使用循环逐次计算幂操作。 3. **使用快速模乘算法:** 在RSA-CRT算法中,模乘运算是一个重要的步骤。可以使用快速模乘算法加速该步骤的计算。例如,可以使用Montgomery算法或Karatsuba乘法等算法来减少乘法运算的次数。 4. **选择合适的优化参数:** 在实现RSA-CRT算法时,可以根据具体应用场景的需求选择合适的优化参数。例如,选择适当的模数大小、模数的选择等。 5. **利用硬件加速:** 可以利用硬件加速技术,如使用英特尔的AES指令集来提高加密和解密操作的效率。 总之,通过合适的数据结构选择、适当的数学运算优化和硬件加速等方法,可以提高RSA-CRT算法的效率,并减少代码的复杂性和冗余部分。但需要注意,在进行代码精简和优化时,必须确保算法的正确性和安全性。 ### 回答3: RSA-CRT(Chinese Remainder Theorem)是一种用于加密和解密数据的广泛使用的公钥加密算法。为了提高RSA-CRT算法的效率,可以从以下几个方面进行代码精简和优化。 1. 平方乘法算法优化:在RSA-CRT中,模幂运算是一种基本的运算,用于实现加密和解密操作。在平方乘法算法中,可以利用平方运算的可重用性和乘法运算的对称性,通过计算乘方的平方根和平方的积的方式来提高效率。 2. 模重复平方优化:对于指数较大的情况,可以使用模重复平方算法来降低计算时间,避免重复计算大数次幂。这可以通过对指数进行二进制分解,并利用幂的平方性质来实现。 3. 选择合适的素数:在使用CRT进行RSA加解密时,需要选择两个不同的素数p和q。为了提高计算效率,可以选择适当大小的素数,既能保证安全性又能减少计算量。 4. 整除性检查的优化:在CRT中,需要使用模除运算对加密数据进行分组。为了提高效率,可以通过一些技巧来避免多次重复进行模除运算,例如使用位运算或乘法运算来替代模除运算。 5. 数据结构优化:在实现RSA-CRT算法时,可以使用适当的数据结构来存储和处理大数,如使用数组、位操作和移位运算等。 通过上述优化措施,可以大大提高RSA-CRT算法的运行效率和执行速度,使其适用于更广泛的应用场景,减少计算时间和资源消耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值