JavaScript DHTML/Security/RSA Encoding
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: 10001Private 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>