信息发布→ 登录 注册 退出

rsa详解及例题及python算法

发布时间:2026-01-11

点击量:
目录
  • rsa 详解及例题及python
    • 算法原理
    • 算法描述
    • 案例手稿
    • 实现python 运算
      • m=71 -> c=15
      • c=15 -> m=71
    • 正常的rsa c->m
      • m->c
    • 安全性
      • 运算速度

      rsa 详解及例题及python

      算法原理

      RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

      算法描述

      • 任意选取两个不同的大素数p和q计算乘积 n=pq
      • n 的欧拉函数 φ(n): φ(n)=(p-1)(q-1)
      • 任意选取一个大整数e,满足 gcd(e, φ(n))=1,整数e用做加密钥
      • (注意:gcd是最大公约数,e的选取是很容易的,例如,所有大于p和q的素数都可用)
      • 确定的解密钥d,满足 (de) mod φ(n) = 1
      • 公开整数n和e,秘密保存d
      • 公钥(n,e)
      • 私钥(n,d)

      c:密文
      m:明文

      将明文 m 加密成密文c :c = m^e mod n
      将密文 c 解密为明文m: m = c^d mod n

      案例手稿

      我可是开了计算器的,这手算不来 ,数据真实有效

      实现python 运算

      数据同手稿最后一个

      m=71 -> c=15

      import gmpy2
      
      e = 13
      p = 7
      q = 11
      m = 71  # 明文
      n = p * q
      phi = (p-1)*(q-1)  # 求φ(n)
      d = gmpy2.invert(e, phi)  # 解密指数d
      c = pow(m, e, n)  # c = m^e mod n
      print(c)  # 15

      c=15 -> m=71

      import gmpy2
      
      e = 13
      p = 7
      q = 11
      c = 15  # 密文
      n = p * q
      phi = (p-1)*(q-1)  # 求φ(n)
      d = gmpy2.invert(e, phi)  # 解密指数d
      m = pow(c, d, n)  # m = c^d mod n
      print(m)  # 71

      正常的rsa c->m

      import gmpy2
      
      e = 65537
      p = 164350308907712452504716893470938822086802561377251841485619431897833167640001783092159677313093192408910634151587217774530424780799210606788423235161145718338446278412594875577030585348241677399115351594884341730030967775904826577379710370821510596437921027155767780096652437826492144775541221209701657278949
      q = 107494571486621948612091613779149137205875732174969005765729543731117585892506950289230919634697561179755186311617524660328836580868616958686987611614233013077705519528946490721065002342868403557070176752015767206263130391554820965931893485236727415230333736176351392882266005356897538286240946151616799180309
      c = 17210571768112859512606763871602432030258009922654088989566328727381190849684513475124813364778051200650944085160387368205190094114248470795550466411940889923383014246698624524757431163133844451910049804985359021655893564081185136250014784383020061202577758202995568045817822133418748737332056585115499621035958182697568687907469775302076271824469564025505064692884524991123703791933906950170434627603154363327534790335960055199999942362152676240079134224911013272873561710522794163680938311720454325197279589918653386378743004464088071552860606302378595024909242096524840681786769068680666093033640022862042786586612
      n = p * q
      phi = (p - 1) * (q - 1)
      d = gmpy2.invert(e, phi)
      # print(d)
      # d = 10095641463285806689688988669044958090788365778905483762638208789928575529502449849401292767726529997650439299015629157860588641396532350448192417234115775710546923180797320293516940576508757762754018567918113024001776672047516740167084526876904933632661036267682605889561715539758853760422969139832554919002326234307334716814878144233472982025457216787932684627988735853402622522302446460089411169271999550088279345136169249058325303590053665436848597082040492623325205128048625400148897314726782189085723532731019805440603017682798178125617958332012328823973231309306940239141155633610022544319334662491790481464305
      m = pow(c, d, n)  # m = c^d mod n
      print(m)
      # m = 164244530130068579551298796969937831989529603092769

      m->c

      import gmpy2
      
      e = 65537
      p = 164350308907712452504716893470938822086802561377251841485619431897833167640001783092159677313093192408910634151587217774530424780799210606788423235161145718338446278412594875577030585348241677399115351594884341730030967775904826577379710370821510596437921027155767780096652437826492144775541221209701657278949
      q = 107494571486621948612091613779149137205875732174969005765729543731117585892506950289230919634697561179755186311617524660328836580868616958686987611614233013077705519528946490721065002342868403557070176752015767206263130391554820965931893485236727415230333736176351392882266005356897538286240946151616799180309
      m = 164244530130068579551298796969937831989529603092769
      n = p * q
      phi = (p - 1) * (q - 1)
      d = gmpy2.invert(e, phi)
      # print(d)
      # d = 10095641463285806689688988669044958090788365778905483762638208789928575529502449849401292767726529997650439299015629157860588641396532350448192417234115775710546923180797320293516940576508757762754018567918113024001776672047516740167084526876904933632661036267682605889561715539758853760422969139832554919002326234307334716814878144233472982025457216787932684627988735853402622522302446460089411169271999550088279345136169249058325303590053665436848597082040492623325205128048625400148897314726782189085723532731019805440603017682798178125617958332012328823973231309306940239141155633610022544319334662491790481464305
      c = pow(m, e, n)  # c = m^e mod n
      print(c)
      # c=17210571768112859512606763871602432030258009922654088989566328727381190849684513475124813364778051200650944085160387368205190094114248470795550466411940889923383014246698624524757431163133844451910049804985359021655893564081185136250014784383020061202577758202995568045817822133418748737332056585115499621035958182697568687907469775302076271824469564025505064692884524991123703791933906950170434627603154363327534790335960055199999942362152676240079134224911013272873561710522794163680938311720454325197279589918653386378743004464088071552860606302378595024909242096524840681786769068680666093033640022862042786586612

      安全性

      RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,也并没有从理论上证明破译。RSA的难度与大数分解难度等价

      RSA算法的保密强度随其密钥的长度增加而增强。但是,密钥越长,其加解密所耗用的时间也越长。因此,要根据所保护信息的敏感程度与攻击者破解所要花费的代价值不值得以及系统所要求的反应时间来综合考虑

      运算速度

      由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。

      一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!