RSA
1 原理
大整数分解困难, 因而暴露一个大整数是安全的。
1.1 过程
加密 M -> c, ( 公钥 N, e)
\(c \equiv M^e \quad (mod \; N)\)
解密 c -> M, (私钥 N, d)
\(M \equiv c^d \quad (mod \; N)\)
1.2 公私钥生成
- 随机生成两个素数 p,q
- 计算 N=pq
- 计算 欧拉数 \(\psi(N)=(p-1)(q-1)\)
- 选取指数e, 满足 \(e \in (1,\psi(n)) 且与\psi(n)互质.实践中一般选e为一个素数, 如65537\)
- 计算e的乘法逆元d,满足 \(ed \equiv 1 \quad (mod\; \psi(n) )\)
- 公钥 N和e, 私钥 N和d
1.3 解密原理
根据一般化的欧拉定理,
\(当 x \equiv y \quad (mod \; \psi(n))时, a^x \equiv a^y \quad (mod \; n)\)
因为: \(ed \equiv 1 \quad (mod\; \psi(n) )\)
故有:\(M^{ed} \equiv M \quad (\mod \, N)\)
又:\(c \equiv M^e \quad (\mod \, N)\)
故根据同余指数性质:
\(c^d \equiv M^{ed} \equiv M \quad (mod \; n)\)
2 代码
RSA = {}
RSA.math = {}
RSA.key = {"N":0,"E":0,"D":0}
RSA.math.powmod = function(a,e,m){
if( m == null) return Math.pow(a,e)
var ma = a % m, b = ma,i=1;
for(;i<e;i++){
b = b * ma % m
}
return b
}
RSA.math.rand = function(s,e){
if( e == null ){
e = s ; s = 0;
}
e = Math.max(s,e)
s = Math.min(s,e)
var r = Math.random(),d=e-s
return parseInt( d*r ) + s
}
RSA.math.prime = function(s){
if( s % 2 ==0) s += 1;
while( !this.isPrime(s)) s+=2;
return s;
}
RSA.math.isPrime = function(a){
if( a % 2 ==0) return 0
var e = parseInt(Math.sqrt(a)) +1,i=3;
while( i<e && a%i ) i+=2;
return i>=e
}
RSA.math.gcd = function(a,b){
if(a==0) {return b } else { while(b){ if(a>b) a=a-b; else b = b-a; }return a}
}
RSA.math.coprime = function(a){
for(var i=3;i<a;i++){
if( this.gcd(a,i) === 1) break;
}
return i<a?i:NaN
}
RSA.gen = function(a,b){
a = this.math.prime( a || this.math.rand(10,100) )
b = this.math.prime( b || this.math.rand(10,100) )
var npq = (a-1)*(b-1),e = this.math.coprime(npq)
if( String(e) == 'NaN' ){
return console.info('error:cannot find e')
}
var limit = Number.MAX_VALUE / 100 / Math.max(a,b)
for(var i=e+1;i<limit;i++){
if( i*e % npq === 1) break;
}
if( i >=limit ){
return console.info('error:cannot find d')
}
var d = i
this.key.N = a*b
this.key.E = e
this.key.D = d
this.key.data = {p:a,q:b,key:this.key}
return this
}
RSA.encode = function(m){
return this.math.powmod(m,this.key.E,this.key.N)
}
RSA.decode = function(e){
return this.math.powmod(e,this.key.D,this.key.N)
}
posted on 2024-01-23 12:29 Simple Love 阅读(26) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档