zoukankan      html  css  js  c++  java
  • 公钥密码RSA算法记录

    介绍: RSA算法是1978年由 R.Rivest、A.Shamir、L.Adleman提出的一种用数论构造的、也是迄今为止理论上最为成熟、完善的公钥密码体,该体制已得到广泛的应用。

    算法描述:

    1. 密钥的产生

    (1) 选两个保密的两个大素数 p 和 q 。
    (2) 计算 n=p*q,φ(n) = (p-1)*(q-1),其中,φ(n)是n的欧拉函数值 (即满足和n互素的在[1,n)区间的数的个数,定理[ φ(m*n) = φ(m)*φ(n),仅当m,n互素时]);
    (3) 选一个整数 e ,满足 1 < e < φ(n),且  gcd(φ(n),e) = 1;
    (4) 计算 d,满足 d*e ≡ 1 mod φ(n),即 d 是 e 在摸φ(n) 下的乘法逆元,因e与φ(n)互素,由模运算可知,他的乘法逆元一定存在[贝祖等式:s*a + t*b = (a,b),此时(e,φ(n))=1,因此必然存在逆元];
    (5) 以 {e,n} 为公钥,以 {d,n} 为私钥。
    

    2.加密

       加密时首先将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于log2(n)(目的应该在于解密时答案的唯一性,即模余值)。然后对每个明文分组m,做加密运算,即
             c ≡ m^e mod(n)

    4. 解密

      对密文分组的解密运算为
             m ≡ c^d mod(n)

    其中的原理易于理解,利用欧拉定理 $a^{φ(m)} ≡ 1 (mod m)$ 以及 $d*e ≡ 1 mod φ(n)$可以得出结论。

    攻击:
      对 n 进行暴力分解出 p 和 q,从而轻易的到密钥 e;本地的工具有windows上的RSATool2v17,可分解256 比特的n,yafu CTF比赛中遇到难以分解的 n 可以试一下,rsa-wiener-attack 用于当e过大或过小时;而目前1024~2048 比特之间的RSA是安全的;
      共模攻击、两大数 n1 和 n2 用相同大素数公约数和低指数攻击;
      重复加密攻击:若 m{e{t+1}} ≡ c(mod n),即 (m{et})^e ≡ c(modn),则有 m{et} ≡ m(mod n) ,即 c{e{t-1}} ≡ m(mod n) ;这种攻击只有在t较小的时候才是可行的,和pq的取值有关。具体如下:
         ce≡(me)e≡m{e^2}(mod n)
         c{e2}≡(me){e2}≡m{e^3}(mod n)
        ...
         c{e{t-1}}≡(me){e{t-1}}≡m{e^t}(mod n)
         c{et}≡(me){et}≡m{e^{t+1}}(mod n)
    重复对以e密文c进行加密,并且与 c 进行比对,若一致,得到t值,则攻击成功。


    之前看过的一篇关于ctf中对于rsa破解的技巧分享,感觉很受用 [【技术分享】CTF中RSA的常见攻击方法](https://www.anquanke.com/post/id/84632)
  • 相关阅读:
    MYSQL删除表的记录后如何使ID从1开始
    Python chardet 字符编码判断
    中文搜索引擎技术揭密
    python 处理中文网页时,忽略特殊字符,忽略异常
    cmd 之基础命令
    自己写的删除主键的存储过程
    朝花夕拾delphi的三层结构
    ERWIN中的一对多标识关系和一对多非标识关系
    翻页用的SQL
    关于 Ajax 的一篇通俗易懂的文章
  • 原文地址:https://www.cnblogs.com/zUotTe0/p/10083825.html
Copyright © 2011-2022 走看看