Skip to content

Commit e19c7c5

Browse files
save file
1 parent 87e2f4a commit e19c7c5

File tree

1 file changed

+219
-0
lines changed

1 file changed

+219
-0
lines changed
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
```
2+
3+
4+
5+
console.clear();
6+
7+
var dh = diffie_hellman();
8+
console.log('bits',dh.bits);
9+
var {p,g,q} = dh.init;
10+
console.log('prime',p,'primitive root',g,' [','q',q,']');
11+
var alice = dh.rnd;
12+
var A = dh.power(g,alice,p);
13+
14+
var bob = dh.rnd;
15+
var B = dh.power(g,bob,p);
16+
console.log('alice',alice,'=>',A);
17+
console.log('bob',bob,'=>',B);
18+
var alice_secret = dh.power(B,alice,p);
19+
var bob_secret = dh.power(A,bob,p)
20+
console.log('secret',alice_secret);
21+
//console.log('secret,bob_secret);
22+
console.log(alice_secret==bob_secret);
23+
24+
console.log(dh.time);
25+
function diffie_hellman(bits=1024){
26+
27+
var obj = {};
28+
29+
Object.defineProperty(obj,'init',{get:init});
30+
Object.defineProperty(obj,'rnd',{get:rnd_n});
31+
Object.defineProperty(obj,'time',{get:time});
32+
33+
obj.bits = bits;
34+
35+
var start = performance.now()
36+
37+
38+
function init() {
39+
40+
var q = gen(()=>rnd_n());
41+
var p = gen(()=>q*rnd_n()+1n);
42+
var g = rnd_n()%p;
43+
return {p,g,q};
44+
45+
}//init
46+
47+
48+
function rnd_n(){
49+
50+
var bs = '0b';
51+
for(var i=0;i<bits;i++){
52+
53+
bs += Math.floor(Math.random()*2);
54+
55+
}//for
56+
return BigInt(bs);
57+
58+
}//rnd
59+
60+
61+
function rnd(size=100){
62+
63+
var n = Math.floor(Math.random()*size);
64+
n = BigInt(n);
65+
return n;
66+
67+
}//rnd
68+
69+
70+
function gen(fn){
71+
72+
var p;
73+
while(!isPrime(p=fn()));
74+
return p;
75+
76+
}//gen
77+
78+
79+
function isPrime(prime){
80+
81+
var result = lowlevel();
82+
if(!result){
83+
return false;
84+
}
85+
86+
result = miller_rabin();
87+
return result;
88+
89+
90+
function lowlevel(){
91+
92+
for(var div of list){
93+
94+
if(prime%div==0n){
95+
return false;
96+
}
97+
98+
if(div**2n>=prime){
99+
return true;
100+
}
101+
102+
}//for
103+
104+
return true;
105+
106+
}//lowlevel
107+
108+
109+
function miller_rabin(){
110+
111+
var s = 0;
112+
var d = prime-1n;
113+
114+
while(d%2n==0n){
115+
116+
d >>= 1n;
117+
s += 1;
118+
119+
}//while
120+
121+
var num = 20;
122+
for(var i=0;i<num;i++){
123+
124+
var a = rnd();
125+
if(composite()){
126+
return false
127+
}
128+
129+
}//for
130+
131+
return true
132+
133+
134+
function composite(){
135+
136+
var x = power(a,d,prime);
137+
138+
for(var i=0;i<s;i++){
139+
140+
var y = power(x,2n,prime);
141+
142+
if(y==1n && x!=1n && x!=prime-1n){
143+
return true;
144+
}
145+
146+
x = y;
147+
148+
}//for
149+
150+
if(y!=1n){
151+
return true;
152+
}
153+
154+
return false;
155+
156+
}//composite
157+
158+
}//miller_rabin
159+
160+
}//isPrime
161+
162+
163+
obj.power=power;
164+
function power(x,y,p){
165+
166+
var res = 1n;
167+
x = x%p;
168+
169+
while(y>0){
170+
171+
if(y&1n){
172+
res = (res*x)%p;
173+
}
174+
175+
y = y>>1n;
176+
x = (x*x)%p;
177+
178+
}//while
179+
180+
return res;
181+
182+
}//power
183+
184+
185+
var list = [
186+
2n, 3n, 5n, 7n, 11n, 13n, 17n, 19n, 23n, 29n,
187+
31n, 37n, 41n, 43n, 47n, 53n, 59n, 61n, 67n,
188+
71n, 73n, 79n, 83n, 89n, 97n, 101n, 103n,
189+
107n, 109n, 113n, 127n, 131n, 137n, 139n,
190+
149n, 151n, 157n, 163n, 167n, 173n, 179n,
191+
181n, 191n, 193n, 197n, 199n, 211n, 223n,
192+
227n, 229n, 233n, 239n, 241n, 251n, 257n,
193+
263n, 269n, 271n, 277n, 281n, 283n, 293n,
194+
307n, 311n, 313n, 317n, 331n, 337n, 347n, 349n
195+
];
196+
197+
198+
function time(){
199+
200+
var time = (performance.now()-start).toFixed(1)+'ms';
201+
return time;
202+
203+
}//time
204+
205+
206+
return obj;
207+
208+
}//diffie-hellman
209+
210+
211+
212+
213+
214+
215+
216+
217+
```
218+
219+

0 commit comments

Comments
 (0)