JavaScript DHTML/Security/RSA Encoding

Материал из Web эксперт
Перейти к: навигация, поиск

RSA Encoding in JavaScript

   <source lang="html4strict">

<html>

 <head>
   
   <title>RSA Encoding</title>
 </head>
 <body>
   <script language="JavaScript">0) {
 r+=s.charAt(rand(sl))
}
//status("rstring "+r)
return r

} function key2(k) {

var l=k.length
var kl=l
var r=""
while(l--) {
 r+=k.charAt((l*3)%kl)
}
return r

} function rsaEncrypt(keylen,key,mod,text) {

// I read that rc4 with keys larger than 256 bytes doesn"t significantly
// increase the level of rc4 encryption because it"s sbuffer is 256 bytes
// makes sense to me, but what do i know...
status("encrypt")
if(text.length >= keylen) {
 var sessionkey=rc4(rstring(text,keylen),rstring(text,keylen))
 // session key must be less than mod, so mod it
 sessionkey=b2t(bmod(t2b(sessionkey),t2b(mod)))
 alert("sessionkey="+sessionkey)
 // return the rsa encoded key and the encrypted text
 // i"m double encrypting because it would seem to me to
 // lessen known-plaintext attacks, but what do i know
 return modexp(sessionkey,key,mod) +
  rc4(key2(sessionkey),rc4(sessionkey,text))
} else {
 // don"t need a session key
 return modexp(text,key,mod)
}

} function rsaDecrypt(keylen,key,mod,text) {

status("decrypt")
if(text.length <= keylen) {
 return modexp(text,key,mod)
} else {
 // sessionkey is first keylen bytes
 var sessionkey=text.substr(0,keylen)
 text=text.substr(keylen)
 // un-rsa the session key
 sessionkey=modexp(sessionkey,key,mod)
 alert("sessionkey="+sessionkey)
 // double decrypt the text
 return rc4(sessionkey,rc4(key2(sessionkey,text),text))
}

} function trim2(d) { return d.substr(0,d.lastIndexOf("1")+1) } function bgcd(u,v) { // return greatest common divisor

// algorythm from http://algo.inria.fr/banderier/Seminar/Vallee/index.html
var d, t
while(1) {
 d=bsub(v,u)
 //alert(v+" - "+u+" = "+d)
 if(d=="0") {return u}
 if(d) {
  if(d.substr(-1)=="0") {
   v=d.substr(0,d.lastIndexOf("1")+1) // v=(v-u)/2^val2(v-u)
  } else v=d
 } else {
  t=v; v=u; u=t // swap u and v
 }
}

} function isPrime(p) {

var n,p1,p12,t
p1=bsub(p,"1")
t=p1.length-p1.lastIndexOf("1")
p12=trim2(p1)
for(n=0; n<2; n+=mrtest(p,p1,p12,t)) {
 if(n<0) return 0
}
return 1

} function mrtest(p,p1,p12,t) {

// Miller-Rabin test from forum.swathmore.edu/dr.math/
var n,a,u
 a="1"+rstring("01",Math.floor(p.length/2)) // random a
 //alert("mrtest "+p+", "+p1+", "+a+"-"+p12)
 u=bmodexp(a,p12,p)
 if(u=="1") {return 1}
 for(n=0;n<t;n++) {
  u=bmod(bmul(u,u),p)
  //dg+=u+" "
  if(u=="1") return -100
  if(u==p1) return 1
 }
 return -100

} pfactors="11100011001110101111000110001101"

// this number is 3*5*7*11*13*17*19*23*29*31*37

function prime(bits) {

// return a prime number of bits length
var p="1"+rstring("001",bits-2)+"1"
while( ! isPrime(p)) {
 p=badd(p,"10"); // add 2
}
alert("p is "+p)
return p

} function genkey(bits) {

q=prime(bits)
do {
 p=q
 q=prime(bits)
} while(bgcd(p,q)!="1")
p1q1=bmul(bsub(p,"1"),bsub(q,"1"))
// now we need a d, e,  and an n so that:
//  p1q1*n-1=de  -> bmod(bsub(bmul(d,e),"1"),p1q1)="0"
// or more specifically an n so that d & p1q1 are rel prime and factor e
n="1"+rstring("001",Math.floor(bits/3)+2)
alert("n is "+n)
factorMe=badd(bmul(p1q1,n),"1")
alert("factor is "+factorMe)
//e=bgcd(factorMe,p1q1)
//alert("bgcd="+e)
e="1"
// is this always 1?
//r=bdiv(factorMe,e)
//alert("r="+r.q+" "+r.mod)
//if(r.mod != "0") {alert("Mod Error!")}
//factorMe=r.q
d=bgcd(factorMe,"11100011001110101111000110001101")
alert("d="+d)
if(d == "1" && e == "1") {alert("Factoring failed "+factorMe+" p="+p+" q="+q)}
e=bmul(e,d)
r=bdiv(factorMe,d)
d=r.q
if(r.mod != "0") {alert("Mod Error 2!")}
this.mod=b2t(bmul(p,q))
this.pub=b2t(e)
this.priv=b2t(d)

} function status(a) { }//alert(a)} // -->

   </script>

RSA-type:

Note that long keys will likely be slow.

<form method="POST" name="RSA">

keylength: <input type="text" size="4" name="keylen" value="2"> How many bytes?  
key: <input type="text" size="60" name="key" value="10001"> Binary

modulo:

<input type="text" size="60" name="mod" value="110010100001"> Binary
text: <textarea name="text" rows="6" cols="60"></textarea> For sample values you can use:
           Public Key: 10001
Modulo: 110010100001
Private Key: 101011000001
             <script language="JavaScript"></script>

<input type="button" name="B1" value="Encrypt" onclick="RSAencryptDemo()"> <input type="button" name="B2" value="Decrypt" onclick="RSAdecryptDemo()">

   </form>
 </body>

</html>

</source>