zoukankan      html  css  js  c++  java
  • RSA算法原理

    密钥生成的步骤

    第一步:生成密钥对,即公钥和私钥。

    1:随机找两个质数 P 和 Q ,P 与 Q 越大,越安全

    比如 P = 67 ,Q = 71。计算他们的乘积 n = P * Q = 4757 ,转化为二进为 1001010010101,该加密算法即为 13 位,实际算法是 1024 位 或 2048 位,位数越长,算法越难被破解。

    2:计算 n 的欧拉函数 φ(n)。

    φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。例如:在 1 到 8 之中,与 8 形成互质关系的是1、3、5、7,所以 φ(n) = 4。

    如果 n = P * Q,P 与 Q 均为质数,则 φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1)

    本例中 φ(n) = 66 * 70 = 4620,这里记为 m, m = φ(n) = 4620

    3:随机选择一个整数 e,条件是1< e < m,且 e 与 m 互质

    公约数只有 1 的两个整数,叫做互质整数,这里我们随机选择 e = 101      (实际应用中,常常选择65537。)

    4:计算出一个整数 d,可以使得 e*d 除以 m 的余数为 1

    这个式子等价于 ed - 1 = km

    于是,找到整数d,实质上就是对下面这个二元一次方程求解:

    ex+my=1

    已知  e = 101 m = 4620,即:101x+4620y=1;

    这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。 总之算出一组整数解(x,y )= ( 1601,35),即 d = 1601。 到此密钥对生成完毕。不同的 e 生成不同的 d,因此可以生成多个密钥对。

    本例中公钥为 (n,e) = (4757 , 101),私钥为 (n,d) = (4757 ,1601) ,仅(n,e) = (4757 , 101) 是公开的,其余数字均不公开。可以想像如果只有 n 和 e,如何推导出 d,目前只能靠暴力破解,位数越长,暴力破解的时间越长。

    第二步:加密生成密文 

    要想使用公钥(n,e) = (4757 , 101)加密,要求被加密的数字必须小于 n,被加密的数字必须是整数,字符串可以取 ascii 值或unicode值

    假设 a 为明文,b 为密文,则按下列公式计算出 b

    a^e % n = b

    计算 [228,184,173]的密文:

    228^101 % 4757 = 4296

    184^101 % 4757 = 2458

    173^101 % 4757 = 3263

    即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果没有私钥 d ,神仙也无法从 [4296,2458,3263]中恢复 [228,184,173]。

    第三步:解密生成明文

    乙收到密文 [4296,2458,3263],并用自己的私钥(n,d) = (4757 ,1601) 解密。解密公式如下: 假设 a 为密文,b 为明文,则按下列公式计算出 b

    a^d % n = b

    密文 [4296,2458,3263]的明文如下:

    4296^1601% 4757 = 228

    2458^1601% 4757 = 184

    3263^1601% 4757 = 173

    参考文档:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

  • 相关阅读:
    P1604&P1601
    【USACO OPEN 10】hop
    [usaco2008feb_gold]路面修整
    bzoj1016: [JSOI2008]最小生成树计数
    bzoj1015: [JSOI2008]星球大战starwar
    bzoj1014: [JSOI2008]火星人prefix
    [bzoj3223]文艺平衡树
    bzoj3224: Tyvj 1728 普通平衡树
    bzoj1012: [JSOI2008]最大数maxnumber
    P3369 【模板】普通平衡树 (splay 模板)
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/11514705.html
Copyright © 2011-2022 走看看