RSA demonstration of Javascript and PHP
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
LICENSE
README.md
rsa.html
rsa.php
rsa_pubkey.js

README.md

RSA-JS-PHP

前后端交互时为了保证信息安全可使用RSA方式加密信息,在数据量大的时候可采用AES+RSA结合方式。DEMO演示地址

一点历史

1976年以前,所有的加密方法都是同一种模式:
(1)甲方选择某一种加密规则,对信息进行加密;
(2)乙方使用同一种规则,对信息进行解密。由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法"(Symmetric-key algorithm)。
这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

算法原理

  • RSA算法的主要原理是利用了数论中质数的巧妙关系即欧拉定理,要实现RSA算法需找到三个具有特定关系的值,在此命名为n、e、d;
  • 假设有两个值互为质数的正整数p和q,(为了便于运算演示,取的值比较小,通常情况下是取的非常大的值,值越大破解的难度越大),p=5 q=17 即 p和q的乘积为n=5x17=85;
  • 计算得出n的欧拉函数φ(n)=(p-1)(q-1)=64,在区间(1,64)中随机选择一个数e=13,,需保证e和φ(n)为互质关系;
  • 计算e对于φ(n)的模反元素d,得出d=5;至此,已经得到了三个具有特定关系的值 n=85 e=13 d=5,设公钥为(n,e),私钥即为(n,d);
  • 假设用户发送数字3到服务端,通过RSA加密的过程为:m=(3^13) mod 85=63,mod为求模,得到密文63;
  • 服务端收到密文m=63,解密过程为 s=(63^5) mod 85=3,最终得出原文为3;
  • 加解密关系为 m=(s^e) mod n,s=(m^d) mod n;私钥与公钥可互相使用,只需要保护一个不被泄露即可;
  • 于是私钥泄露就意味着RSA加密失去意义;

使用方式

请确保PHP的openssl扩展开启,且保证php在环境变量中,如果是windows需添加环境变量:名 OPENSSL_CONF,值 D:\http\php\extras\ssl\openssl.cnf(根据openssl.cnf目录而定);

  • 生成新的公私钥文件在项目根目录命令行运行:
php rsa.php new
  • 保护好私钥,确保私钥不被暴露在web可访问目录下;
  • 将生成的rsa_pubkey.js引入到web项目中,具体请运行DEMO演示即可;
  • rsa.class.php的使用:
// 初始化参数,设置公钥与私钥的路径
rsa::$prikey = 'src/key/private.pem';
rsa::$pubkey = 'src/key/public.pem';

// JavaScript脚本生成位置,用于重新生成公私钥
rsa::$script = 'rsa_pubkey.js';

// $model = 1 公钥加密,私钥解密:公开公钥,保存私钥
// $model = 2 私钥加密,公钥解密:公开私钥,保存公钥
rsa::$model = 1;

// RSA加密
rsa::encrypt($data);

// RSA解密
rsa::decrypt($data);

// RSA签名
rsa::sign($data);

// RSA验签
rsa::verify($data, $sign);

Javascript加密来源于开源项目jsencrypt