主页

索引

模块索引

搜索页面

rsa加解密

openssl rsa

RSA:

简介:
 1977 年
 作者:
  * 麻省理工学院三位数学家Rivest、Shamir 和 Adleman
  * 罗纳德・李维斯特(Ron Rivest)
  * 阿迪・萨莫尔(Adi Shamir)
  * 伦纳德・阿德曼(Leonard Adleman)

算法:
 加密: 密文=明文^E mod N
 公钥: E 和 N 的组合
 解密: 明文=密文^D mod N
 私钥: D 和 N 的组合

说明:
 对极大整数做因数分解的难度决定了RSA算法的可靠性
 第一个能同时用于加密和数字签名的算法
 速度是对应同样安全级别的对称密码算法的1/1000左右

缺点:
 前向不安全
  * 私钥参与了密钥交换
  * 安全性取决于私钥是否安全保存

历史:

1977年,三位数学家Rivest、Shamir 和 Adleman
设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名
对极大整数做因数分解的难度决定了RSA算法的可靠性
换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作

由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现
速度一直是RSA的缺陷。一般来说只用于少量数据加密
RSA的速度是对应同样安全级别的对称密码算法的1/1000左右

已公开的或已知的攻击方法:

1999年,RSA-155 (512 bits)被成功分解,
花了五个月时间(约8000 MIPS年)和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成
2009年12月12日,编号为RSA-768(768 bits, 232 digits)数也被成功分解
这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上
https://img.zhaoweiguo.com/knowledge/images/encrypts/rsa_course.gif

PKCS 补位算法

  • PKCS 补位算法是一种用于数据加密的填充方法,被广泛应用于公钥加密和数字签名技术中。该算法采用基于二进制补位的填充方式,以确保待加密的数据长度符合加密算法的要求。

  • 在 PKCS 补位算法中,如果待加密的数据长度正好是块大小的整数倍,则需要增加一个完整的数据块,其中所有字节都是补位的字节数。如果待加密的数据长度不是块大小的整数倍,则需要添加补位字节,使得数据长度达到下一个块的整数倍。补位字节的值通常等于需要填充的字节数。

  • PKCS 补位算法是对称加密算法中常用的一种填充方式,而非对称加密算法则常用 PKCS#1_v1.5 和 OAEP(PKCS#1_v2)等填充算法。

其他变种

1. EIGamal 方式:
    与 RSA 不同的点在使用『离散对数』
    密文长度是明文的2倍
    由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。
2. Rabin方式
 与 RSA 不同的点在使用『平方根』

3. ECC(椭圆曲线密码, Elliptic Curve Cryptography):
1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出
ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。

RSA算法流程

算法原理

算法本身基于一个简单的数论知识:给出两个素数,很容易算出乘积,然而通过乘积,计算出这两个素数就非常困难,尤其是素数为几百位的整数的情况下。

公钥和私钥的生成&使用

公钥和私钥的生成:

准备两个非常大的素数 p 和 q;
计算 p 和 q 的乘积 n = p * q;
计算 (p-1)* (q-1) 的乘积 m =(p-1)* (q-1);
找到一个数 e (1< e < m),并满足 e 和 m 最大公约数为 1(即互为素数);
找到一个数 d 使得 (e * d) % m = 1
即可得到 (n,e) 为公钥,(n,d) 为私钥

RSA 加密:

对于明文 x,使用公钥(n,e)通过幂运算然后取模,加密过程为:y = x ^ e % n;y 即为密文。

RSA 解密:

对于密文 y,使用私钥(n,d)解密过程和加密过程类似,为:x = y ^ d % n。

示例

密钥生成:

取两个素数 p=11,q=13;计算 n = p * q =143;
计算 m =(p-1)* (q-1) = 10 * 12 = 120;
取一个数 e (1< e < m),并满足 e 和 m 互为素数,取 e=7;
取一个数 d 使得 (e * d) % m = 1,由于(7 * 103)% 120 = 721 % 120 = 1,取 d = 103;
那么公钥 =(n,e)=(143,7)私钥 =(n,d) =(143, 103);

加密运算:

明文 x = 75, 密文 y = (x ^ e % n) = (75 ^ 7 % 143) = 13,348,388,671,875 % 143 = 114

解密运算:

密文 y = 114,明文 x = (y ^ d % n) = (114 ^ 103 % 143) = 7.2643989613883693165853565422956e+211 % 143 = 75

主页

索引

模块索引

搜索页面