Elgamal

HTML

<div style="font-family:monospace">Your private key:
  <span id="userPriKeyBox"></span>

  <br/>Your public key:&nbsp;
  <span id="userPubKeyBox"></span>

  <br/>Recipient's public key:
  <input id="recPubKeyBox" style="font-family:monospace">
  <br/>
  <textarea id="inputBox" rows="15" cols="50" style="font-family:monospace"></textarea>
  <br/>
  <input type="button" value="Encrypt" id="encryptBox" />
  <input type="button" value="Decrypt" id="decryptBox" />
  <br/>
</div>

JavaScript

var Alphabet = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ \n𮃩∆";

Alphabet = Alphabet.split("");

var Crypto = function(alpha, gen, C) {
  var p, B, encrypt, decrypt, f, g, modInv, modPow, toAlpha, to10;
  toAlpha = function(x) {
    var y, p, l, n;
    if (x === 0) {
      return "!!!!";
    }
    y = [];
    n = 4;
    n = Math.ceil(n);
    while (n--) {
      p = Math.pow(alpha.length, n);
      l = Math.floor(x / p);
      y.push(alpha[l]);
      x -= l * p;
    }
    y = y.join("");
    return y;
  };
  to10 = function(x) {
    var y, p, n;
    y = 0;
    p = 1;
    x = x.split("");
    n = x.length;
    while (n--) {
      y += alpha.indexOf(x[n]) * p;
      p *= alpha.length;
    }
    return y;
  };
  modInv = function(gen, mod) {
    var v, d, u, t, c, q;
    v = 1;
    d = gen;
    t = 1;
    c = mod % gen;
    u = Math.floor(mod / gen);
    while (d > 1) {
      q = Math.floor(d / c);
      d = d % c;
      v = v + q * u;
      if (d) {
        q = Math.floor(c / d);
        c = c % d;
        u = u + q * v;
      }
    }
    return d ? v : mod - u;
  };
  modPow = function(base, exp, mod) {
    var c, x;
    if (exp === 0) {
      return 1;
    } else if (exp < 0) {
      exp = -exp;
      base = modInv(base, mod);
    }
    c = 1;
    while (exp > 0) {
      if (exp % 2 === 0) {
        base = (base * base) % mod;
        exp /= 2;
      } else {
        c = (c * base) % mod;
        exp--;
      }
    }
    return c;
  };
  p = 91744613;
  C = parseInt(C, 10);
  if (isNaN(C)) {
    C = Math.round(Math.sqrt(Math.random() * Math.random()) * (p - 2) + 2);
    alert("Your new private key is " + C);
  }
  B = modPow(gen, C, p);
  decrypt = function(a) {
    var d, x, y;
    x = a[1];
    y = modPow(a[0], -C, p);
    d = (x * y) % p;
    d = Math.round(d) % p;
    return alpha[d - 2];
  };
  encrypt = function(key, d) {
    var k, a;
    k = Math.ceil(Math.sqrt(Math.random() * Math.random()) *...