Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var RSA = {
- getPublicKey: function($pem) {
- if ($pem.length < 50)
- return false;
- if ($pem.substr(0, 26) != "-----BEGIN PUBLIC KEY-----")
- return false;
- $pem = $pem.substr(26);
- if ($pem.substr($pem.length - 24) != "-----END PUBLIC KEY-----")
- return false;
- $pem = $pem.substr(0, $pem.length - 24);
- $pem = new ASN1Data(Base64.decode($pem));
- if ($pem.error)
- return false;
- $pem = $pem.data;
- if ($pem[0][0][0] == "1.2.840.113549.1.1.1")
- return new RSAPublicKey($pem[0][1][0][0], $pem[0][1][0][1]);
- return false;
- },
- encrypt: function($data, $pubkey) {
- if (!$pubkey)
- return false;
- var bytes = ($pubkey.modulus.bitLength() + 7) >> 3;
- $data = this.pkcs1pad2($data, bytes);
- if (!$data)
- return false;
- $data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);
- if (!$data)
- return false;
- $data = $data.toString(16);
- while ($data.length < bytes * 2)
- $data = '0' + $data;
- return Base64.encode(Hex.decode($data));
- },
- decrypt: function($text, $pubkey)
- {
- if (!$pubkey)
- return false;
- $text = Hex.encode(Base64.decode($text)).toString(16);
- while ($text[0] == '0')
- $text = $text.replace('0', '');
- $text = new BigInteger($text, 16);
- $text = $text.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);
- if (!$text)
- return false;
- var bytes = ($pubkey.modulus.bitLength() + 7) >> 3;
- $text = this.pkcs1unpad2($text, bytes);
- return $text;
- },
- pkcs1pad2: function pkcs1pad2(s, n) {
- if (n < s.length + 11) { // TODO: fix for utf-8
- alert("Message too long for RSA");
- return null;
- }
- var ba = new Array();
- var i = s.length - 1;
- while (i >= 0 && n > 0) {
- var c = s.charCodeAt(i--);
- if (c < 128) { // encode using utf-8
- ba[--n] = c;
- }
- else if ((c > 127) && (c < 2048)) {
- ba[--n] = (c & 63) | 128;
- ba[--n] = (c >> 6) | 192;
- }
- else {
- ba[--n] = (c & 63) | 128;
- ba[--n] = ((c >> 6) & 63) | 128;
- ba[--n] = (c >> 12) | 224;
- }
- }
- ba[--n] = 0;
- var rng = new SecureRandom();
- var x = new Array();
- while (n > 2) { // random non-zero pad
- x[0] = 0;
- while (x[0] == 0)
- rng.nextBytes(x);
- ba[--n] = x[0];
- }
- ba[--n] = 2;
- ba[--n] = 0;
- return new BigInteger(ba);
- },
- pkcs1unpad2: function pkcs1unpad2(d, n)
- {
- var b = d.toByteArray();
- var i = 0;
- while (i < b.length && b[i] == 0)
- ++i;
- /*if (b.length - i != n - 1 || b[i] != 2)
- return null;*/
- ++i;
- while (b[i] != 0)
- if (++i >= b.length)
- return null;
- var ret = "";
- while (++i < b.length) {
- var c = b[i] & 255;
- if (c < 128) { // utf-8 decode
- ret += String.fromCharCode(c);
- }
- else if ((c > 191) && (c < 224)) {
- ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
- ++i;
- }
- else {
- ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
- i += 2;
- }
- }
- return ret;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment