小白都能看的懂的RSA密码算法原理

RSA加密算法

RSA加密算法是一种非对称加密算法。应用场景:
加密特点:相对安全、加密效率低、加密数据小

使用RSA加密算法完整的流程是:

  1. 产生对应的公钥和私钥
  2. 使用算法对数据加密
  3. 使用对应算法对加密后的数据解密

1.公钥私钥的产生

小白都能看的懂的RSA密码算法原理

涉及到几个概念:欧拉函数、模逆元,我们逐个看一下

欧拉函数

概念:任意给定正整数n,求出在小于等于n的正整数之间有多少个与n构成互质关系。
计算这个值的方式叫做欧拉函数,使用 ϕ(n)\phi (n)表示如ϕ(8)=4\phi(8)=4,计算8的欧拉函数,1、2、3、4、5、6、7、8,其中1357互质,个数为4.
ϕ(7)=6\phi(7)=6,1、2、3、4、5、6均是,个数为6.

函数特点
小白都能看的懂的RSA密码算法原理

模逆元

概念:也称模反元素,如果两个正整数e和x互质,那么一定可以找到整数d,是的ed-1被x整除。
(ed)%x=1(e*d)\%x=1对应的
ed=kx+1e*d=k*x+1,此时d就是e的对于x的模反元素。

2.加密消息

小白都能看的懂的RSA密码算法原理

3.解密消息

小白都能看的懂的RSA密码算法原理
整理流程图小白都能看的懂的RSA密码算法原理
其中:
公钥:n和e
私钥:n和d
明文:m
密文:m
说明:
1.n会非常大,长度一般为1024个二进位,目前人类已经分解的最大整数,232个十进制比特位,768个二进制位。
2.由于要求出ϕ(n)\phi(n),根据欧拉函数特点,最简单的方式就是n由两个质数相乘得到p1,p2,ϕ(n)=(p11)(p21)\phi(n)=(p1-1)(p2-1)
3.最终由ϕ(n)\phi(n)得到e和d,根据上面的模反元素。
关于RSA的安全:
除了公钥用到了n和e其余4个数字是不公开的,目前**RSA得到d的方式如下:
1.要想求出d,由于ed=ϕ(n)k+1e*d=\phi(n)*k+1
2.e是知道的,但是要知道ϕ(n)\phi(n).,必须知道p1和p2.
3.由于n=p1*p2.只有将n因数分解才能算出来。

终端命令演示

Mac系统内置了OpenSSL(开源加密库),所以我们可以直接使用敏玲来玩RSA,


命令 含义
genrsa 生成并输入一个RSA私钥
rsautl 使用RSA秘钥进行加密、解密、签名、验证等运算
rsa 处理RSA秘钥的格式转换等问题
  • 生成RSA秘钥,秘钥长度为1024bit.
    小白都能看的懂的RSA密码算法原理
  • 从私钥中提取公钥
    小白都能看的懂的RSA密码算法原理
    -生成文件如下
    小白都能看的懂的RSA密码算法原理
  • 将私钥转换成明文
  • 通过公钥加密数据,私钥解密数据
    小白都能看的懂的RSA密码算法原理
  • 通过私钥进行加密,公钥解密数据
    小白都能看的懂的RSA密码算法原理
    代码方式实现:
    //1.加载公钥
    [[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];
    //2.加载私钥
    [[RSACryptor sharedRSACryptor] loadPrivateKey: [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];
        NSData * result = [[RSACryptor sharedRSACryptor] encryptData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
        
    //base64编码
    NSString * base64 = [result base64EncodedStringWithOptions:0];
    NSLog(@"加密之后:%@\n",base64);
    
    //解密
    NSData * dcStr = [[RSACryptor sharedRSACryptor] decryptData:result];
    NSLog(@"%@",[[NSString alloc] initWithData:dcStr encoding:NSUTF8StringEncoding]);