La rotacion de asignacion de caracteres se da de forma muy similar a la maquina de la segunda guerra mundial que consiguieron los aliados de un submarino nazi, gracias a la cual pudieron desencriptar los mensajes de ataque de los alemanes, en un array eso se consigue mediante la indexacion con % de coeficientes que te da la resta de una division. He aqui las formulas que he creado:

Código :

//funcio intercanvi a->array,u->index 1 d'intercanvi,v->index 2 d'intercanvi
function intercanvi(a,u,v){var a=a;var u=u%a.length;var v=v%a.length;var b=a[u];var c=a[v];a[u]=c;a[v]=b;return a;}
//funcio norepetit s->string amb posibles lletres repetides el resultat es una cadena sense lletres repetides
function norepetit(s){var f='';var z='';for(var i=0;i<s.length;i++){z=s.charAt(i);if(f.indexOf(z)==-1){f=f+z;}else{}}return f;}
//funcio mesclar a->string 1,b->string 2, barreja equidistalment dos string en un
function mesclar(a,b){var a=a;var b=b;if(a.length<b.length){var g=b;var p=a;}else{var g=a;var p=b;}var t=Math.floor(g.length/p.length);var h=g;for(var i=0;i<p.length;i++){var lletra=p.charAt(i);h=g;g=h.substring(0,((t+1)*i)+1)+lletra+h.substring(((t+1)*i)+1);}return g;}
//funcio desmesclar a->string mesclat,n->longitud del string que era mes llarg
function desmesclar(a,n){if(arguments.length==1){var n=16;}else if(arguments.length>1){var n=n;}else{}   var a=a;var l=(a.length-n);var t=Math.floor(n/l);var p='';var g=a;var z=0;for(var i=0;i<l;i++){z=(t*i)+1;p=p+g.substring(z,z+1);g=g.substring(0,z)+g.substring(z+1);}var u=new Array();u[0]=p;u[1]=g;return u;}
//funcio enigma2 s->string a encriptar
function enigma2 (s){var s=s;var r=norepetit(s);var a=r.split('');var b=s;var c='';for(var i=0;i<b.length;i++){var g=b.charAt(i);var e=a.indexOf(g);var f=e+i+b.length;a=intercanvi(a,e,f);c=c+a[e];}var d=new Array();d[0]=c;d[1]=a.join('');return mesclar(c,a.join(''));}
//function enigma2 (s){var s=s;var r=norepetit(s);var arr=r.split('');var str0=s;var strf='';for(var i=0;i<str0.length;i++){var lletra=str0.charAt(i);var index0=arr.indexOf(lletra);var index1=index0+i+str0.length;arr=intercanvi(arr,index0,index1);strf=strf+arr[index0];}var arf=new Array();arf[0]=strf;arf[1]=arr.join('');return mesclar(strf,arr.join(''));}
//funcio desenigma2 t->string encriptat i mesclat,f->longitud de el string mes llarg
function desenigma2(t,f){var u=desmesclar(t,f);var strf=u[1];var r=u[0];var arr=r.split('');var strf2='';for(var j=0;j<strf.length;j++){var lletra=strf.charAt(strf.length-1-j);var index0=arr.indexOf(lletra);var index1=index0-j+((2*strf.length)-1);arr=intercanvi(arr,index0,index1);strf2=arr[index0]+strf2;}return strf2;}


Eso mismo se puede hacer en una imagen i mostrar con pequeñas variaciones de color (hexagesimalmente) sin que el ojo humano detecte esas diferencias, mostrando strings ocultos que solo se pueden desencriptar por funciones enigma, para mas informacion, http://es.wikipedia.org/wiki/Modos_de_operaci%C3%B3n_de_una_unidad_de_cifrado_por_bloques

un saludo espero que os guste