Skip to content

Instantly share code, notes, and snippets.

@brianteachman
Created September 29, 2012 17:06
Show Gist options
  • Save brianteachman/3804601 to your computer and use it in GitHub Desktop.
Save brianteachman/3804601 to your computer and use it in GitHub Desktop.
ROT-13 letter substitution cipher Constructor. Provides ROT-13 encoding and decoding.
function Rot13() {
var result = "";
var decode = false;
var lookup = function(char, i) {
var lt1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
var lt2 = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm ";
var orig = (decode) ? lt2: lt1;
var enc = (decode) ? lt1: lt2;
// base case
if (i >= orig.length) {
return;
} else if (char === orig[i]) {
result += enc[i];
}
lookup(char, i+1);
};
var cypher = function(name, i) {
if (i > name.length) { return; }
lookup(name[i], 0);
cypher(name, i+1);
return result;
};
this.encode = function(text) {
result = "";
return cypher(text, 0);
};
this.decode = function(text) {
decode = true;
result = "";
return cypher(text, 0);
};
}
var text = new Rot13();
console.log(text);
var name = text.encode("Brian Teachman"); // "Oevna Grnpuzna"
var token = text.decode(name); // "Brian Teachman"
console.log(name+" => "+token);
@JavaScript-Packer
Copy link

Here is my take on it so you do not have to figure out if decode or encode (figures it out) & added more characters so you can even encode JavaScript source code ;)

function cypher(r) {
  function t(r, e) {
    var a = "\n\x20\t`~_^*'\"<+,-.:;=>!?/{|}[\\]#$%&()@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    a.length > e && (r === a.split("").reverse().join("")[e] && (n += a[e]), t(r, e + 1));
  }
  function e(r, a) {
    return a > r.length ? void 0 : (t(r[a], 0), e(r, a + 1), n);
  }
  var n = "";
  return e(r, 0);
}

var name = cypher("Dave Browne modded this <script><\/script>");
var token = cypher(name);
console.log(name+" => "+token);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment