ClassDatenowKey2.js The random number generator:
//ClassDatenowKey2.js //a permutation class function Perm(n){ this.N=n; this.C=new Uint8Array(n); } Perm.prototype.swap=function(i,j){ var a=0; a=this.C[i]; this.C[i]=this.C[j]; this.C[j]=a; };//end swap //Initialize a random permutation Perm.prototype.createPerm=function(){ var i,j; var k=this.N; E.srand(E.hwRand()); for(j=0;j<this.N;j++)this.C[j]=j; for(i=0;i<(this.N-1);i++){ j=parseInt((Math.random()*256)%k,10); this.swap(i,i+j); k--; }//next i };//end createPerm //Use permutation to relocate bits in E to D //dir determines the indirection direction Perm.prototype.doPerm=function(dir,D,E){ var i,j,k,m; for(i=0;i<this.N/8;i++)D[i]=0; for(i=0;i<this.N;i++){ j=this.C[i]; k=i%8; m=j%8; var a=1; var b=1; a=1<<k; b=1<<m; if(dir){ if(E[(i-k)/8]&a) D[(j-m)/8]=D[(j-m)/8]|b; }else{ if(E[(j-m)/8]&b) D[(i-k)/8]=D[(i-k)/8]|a; }//end else }//next i };//end doPerm //Use permutation of length N in E to relocate bytes in C to D Perm.prototype.doPermBytes=function(dir,E,C){ var i,j,k,m; for(i=0;i<this.N;i++)D[i]=0; for(i=0;i<this.N;i++){ j=this.C[i]; if(dir){ D[i]=E[j]; }else{ D[j]=E[i]; }//end else }//next i };//end doPermBytes /////////////////////////// //a oneway class function Oneway(){ this.A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; } Oneway.prototype.oneway1=function(mode,A,B,C,D,E){ switch(mode){ case 0: return A+B+C+D+E; case 1: return A^B^C^D^E; case 2: return A*B*C*D*E; }//end switch };//end oneway1 Oneway.prototype.modit=function(A){ for(var i=0;i<16;i++)A[i]=this.A[i]%256; };//end modit Oneway.prototype.fillit=function(b){ for(var i=0;i<16;i++)this.A[i]=b; };//end fillit Oneway.prototype.oneway=function(mode,B){ var oneway1=this.oneway1; //rows this.A[0]=oneway1(mode,this.A[0],B[0],B[1],B[2],B[3]); this.A[1]=oneway1(mode,this.A[1],B[4],B[5],B[6],B[7]); this.A[2]=oneway1(mode,this.A[2],B[8],B[9],B[10],B[11]); this.A[3]=oneway1(mode,this.A[3],B[12],B[13],B[14],B[15]); //columns this.A[4]=oneway1(mode,this.A[4],B[0],B[4],B[8],B[12]); this.A[5]=oneway1(mode,this.A[5],B[1],B[5],B[9],B[13]); this.A[6]=oneway1(mode,this.A[6],B[2],B[6],B[10],B[14]); this.A[7]=oneway1(mode,this.A[7],B[3],B[7],B[11],B[15]); //diagonals\ this.A[8]=oneway1(mode,this.A[8],B[0],B[5],B[10],B[15]); this.A[9]=oneway1(mode,this.A[9],B[1],B[6],B[11],B[12]); this.A[10]=oneway1(mode,this.A[10],B[2],B[7],B[8],B[13]); this.A[11]=oneway1(mode,this.A[11],B[3],B[4],B[9],B[14]); //diagonals/ this.A[12]=oneway1(mode,this.A[12],B[3],B[6],B[9],B[12]); this.A[13]=oneway1(mode,this.A[13],B[0],B[7],B[10],B[13]); this.A[14]=oneway1(mode,this.A[14],B[1],B[4],B[11],B[14]); this.A[15]=oneway1(mode,this.A[15],B[2],B[5],B[8],B[15]); };//end oneway // Random object // aes1 0= encrypt, 1=decrypt // aes2 0= encrypt, 1=decrypt // pdir1 permutation direction 0 or 1 // pdir2 permutation direction 0 or 1 // owtype 0= add, 1= xor, 2=multiply function Random(aes1,aes2,pdir1,pdir2,owtype){ this.AES1=aes1; this.AES2=aes2; this.Pdir1=pdir1; this.Pdir2=pdir2; this.Owtype=owtype; this.ow=new Oneway(); this.plain=new Uint8Array(16); this.R=new ArrayBuffer(16); this.perm1=new Perm(128); this.key1=new Uint8Array(16); this.perm2=new Perm(128); this.key2=new Uint8Array(16); } Random.prototype.random=function(){ var a; var tt=Date.now()*1000000; for(var i=0;i<16;i++){ if(i===8)tt=Date.now()*1000000; this.R[i]=tt%256; tt=tt-this.R[i]; tt=tt/256; }//nexti E.srand(E.hwRand()); this.R[0]=(Math.random()*256)%256; this.R[8]=(Math.random()*256)%256; this.R[15]=(Math.random()*256)%256; // printit(R); this.perm1.doPerm(this.Pdir1,this.plain,this.R); //printit(plain); if(this.AES1){this.R=AES.encrypt(this.plain,this.key1); }else{ this.R=AES.decrypt(this.plain,this.key1); } //printit(this.R); this.ow.fillit(1); this.ow.oneway(this.Owtype,this.R); this.ow.modit(this.R); //printit(this.R); this.perm2.doPerm(this.Pdir2,this.plain,this.R); //printit(plain); if(this.AES2){this.R=AES.encrypt(this.plain,this.key2); }else{ this.R=AES.decrypt(this.plain,this.key2); } //printit(this.R); return this.R; };//end random Random.prototype.setup_random=function(){ for(var i=0;i<16;i++){ E.srand(E.hwRand()); this.key1[i]=parseInt((Math.random()*256),10); E.srand(E.hwRand()); this.key2[i]=parseInt((Math.random()*256),10); }//nexti this.perm1.createPerm(); this.perm2.createPerm(); }; /////////////////////////////// function printit(W){ console.log(W[0]+','+W[1]+','+W[2]+','+W[3]+','+ W[4]+','+W[5]+','+W[6]+','+W[7]+','+ W[8]+','+W[9]+','+W[10]+','+W[11]+','+ W[12]+','+W[13]+','+W[14]+','+W[15] ); }//end printit function copy(A,B){for(var i=0;i<16;i++)A[i]=B[i];} function compare(A,B){ for(var i=0;i<16;i++)if(A[i]!=B[i])return 0; return 1; } /////////////////////////////// // Random object // aes1 0= encrypt, 1=decrypt // aes2 0= encrypt, 1=decrypt // pdir1 permutation direction 0 or 1 // pdir2 permutation direction 0 or 1 // owtype 0= add, 1= xor, 2=multiply //function Random(aes1,aes2,pdir1,pdir2,owtype){ var R=new Random(1,1,0,0,0); R.setup_random(); console.log("keys"); printit(R.key1); printit(R.key2); console.log("Enter go(); into left screen, press enter"); function go(){ R.key1=R.random(); R.key2=R.random(); R.key1=R.random(); R.key2=R.random(); console.log("keys"); printit(R.key1); printit(R.key2); console.log("Randoms"); for(var j=0;j<16;j++){ printit(R.random()); } }//end go
The output:
>echo(0); keys 95,199,130,197,32,174,21,94,190,94,212,0,219,24,220,209 127,253,226,16,70,146,185,11,202,192,44,70,83,51,120,177 Enter go(); into left screen, press enter =undefined >go(); keys 37,115,239,249,173,235,105,20,202,187,119,250,173,235,105,187 194,44,127,205,23,115,36,6,237,95,250,210,33,201,23,211 Randoms 142,254,220,240,136,215,19,239,149,77,77,124,190,204,102,97 172,247,225,194,124,184,176,179,201,85,70,33,145,196,50,223 171,173,84,67,240,166,53,84,189,241,190,160,65,126,46,16 240,110,20,89,34,209,82,26,84,141,66,199,178,107,45,129 8,76,198,85,81,141,148,70,243,37,27,18,101,39,53,75 156,154,240,83,125,40,83,111,48,193,73,90,88,52,152,150 132,58,124,16,109,99,134,187,72,139,84,109,254,5,163,173 18,166,184,35,1,188,74,73,75,24,107,129,229,6,203,35 46,71,178,73,32,142,191,110,254,127,233,195,82,219,214,121 219,68,7,110,28,230,173,64,123,179,128,4,232,61,157,244 26,86,10,201,79,18,159,126,178,165,128,213,0,220,233,219 160,45,66,180,92,106,130,148,224,180,18,141,20,194,197,167 116,187,81,184,197,46,64,197,107,157,58,72,70,42,241,205 106,243,200,96,187,42,68,165,111,85,121,61,150,128,81,63 112,139,103,246,27,71,38,240,100,136,250,230,24,145,76,69 96,130,236,218,128,193,47,234,34,3,10,30,130,18,74,154
1 Attachment
@ClearMemory041063 started
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
ClassDatenowKey2.js
The random number generator:
The output:
1 Attachment