RSA加密算法原理及JS实现

发展史

1976年以前,加密世界主要采用对称加密算法(Symmetric-key algorithm)。

对称加密存在让人头疼的问题:甲乙双方通信,甲方必须把加密规则告诉乙方,否则无法解密。

保存和传递密钥无法确保安全?

1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,"DH密钥协议算法"。

c84292f6dd02d0fdbfc0a91dd33ec504.png

如上所示,Alice和Bob同时拥有了共享密钥K,私钥a,b也未在互联网上传播,且公开的A\B\g\p在短时间内无法破解出a,b,K。因此DH算法便可以在不安全的网络上协商出密钥,基于此构建安全的加密通道。

这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种新的加密模式被称为 **"非对称加密算法"**。

如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的,可以实现非对称加密。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法

在RSA算法中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。

棱镜门

据NSA前通讯员斯诺登所提供的机密文件显示,NSA跟RSA达成了一份价值1000万美元的合同,前者通过在后者的加密软件中植入一个缺陷公式,为自己留了一道“后门”。据悉,RSA存有缺陷公式的软件叫做Bsafe,而该缺陷公式的名字为Dual Elliptic Curve,它由NSA开发而出。

BSafe是很多企业级用户采购安全软件,此举将让NSA通过随机数生成算法Bsafe的后门程序轻易破解各种加密数据。

RSA原理

根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

密钥生成过程

步骤 概述 公式 说明
1 随机p,q p,q 选择一对不相等且足够大的质数
2 求n n = p*q 计算质数p,q的乘积
3 求φ(n) φ(n) = (p-1)(q-1) 计算n的欧拉函数
4 求e 1 < e < φ(n) 选一个和φ(n)互质的整数e
5 求d ed = 1 (mod φ(n)) 计算出e对于φ(n)的模反元素d
6 公钥 e,n PK(e, n)
7 私钥 d,n SK(d, n)
第一步:随机p,q

p,q为不相等且足够大的质数。

质数(素数):一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

代码实现:

function isPrime(num) {
  for (let i = 2; i < num; i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return true;
}
function getPrime(min, max) {
  const rst = [];
  for (let i = Math.max(2, min); i <= max; i++) {
    if (isPrime(i)) {
      rst.push(i);
    }
  }
  return rst;
} 
// 第一步,随机选择两个不相等的质数p和q
let primeList = getPrime(1, 100);
const pIndex = Math.floor(Math.random() * 1000) % primeList.length;
const p = primeList[pIndex];
primeList.splice(pIndex, 1);
const qIndex = Math.floor(Math.random() * 1000) % primeList.length;
const q = primeList[qIndex];

第二步:求n

n 的长度就是密钥长度。

n = p * q = 11 * 3 = 33;

33写成二进制是100001,一共有6位,所以这个密钥就是6位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值