dgreceanu of The Code Killers
5/18/2014 - 9:32 AM

Scurtă documentație de utilizare sjcl pentru chei de lungime mai mare

Scurtă documentație de utilizare sjcl pentru chei de lungime mai mare

Pentru că exemplele date pe pagina de home a bibliotecii Javascript pentru criptare SJCL ( Stanford Javascript Crypto Library ) sunt pentru folosirea cea mai simplă, adică:

sjcl.encrypt("password", "data")
și
sjcl.decrypt("password", "encrypted-data")

am zis să vă dau mai jos niște exemple despre cum se apelează funcțiile alea pentru variantele mai complexe, cu chei de lungi mai mari, includerea de tag-uri și date de autentificare în corpul mesajului criptat pentru verificare gen username/password.

var obiect_de_criptat = {
  "numar_cerere":"BR000023",
  "solicitant":"Victor Ponta"
};

/**
 *   vrem să criptăm chestia asta pentru a fi citită doar de utilizatorul vibob cu parola apia2014
 *   și vrem să folosim cheie de lungime 256 biți ( apelarea default e cu 128 ) și iterații pentru
 *   număr de iterații pentru calcularea cheii de 5000 de iterații (default este 1000)
 *   cifrarea este AES și modul de cifrare este ocb2 (ceva mai rapid)
 *
 */  mai multe detalii despre chestiile astea găsiți la http://bitwiseshiftleft.github.io/sjcl/demo/

var mesaj_criptat = sjcl.encrypt("apia2014",JSON.stringify(obiect_de_criptat),{adata:"vibob",ks:256,mode:"ocb2",iter:5000});

/*
*   șirul de caractere obținut după criptare arată de forma
*   "{"iv":"9+bxT91DygsDWLNhxuUc3g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"vibob","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ebPCMvyV+kithNlYfUY93cKOrduNYrNmCq8Qaos01lrAQEI9rLKnNT7yvNT3rdbftQjs8SI+o6wmcFVcCUmf"}"
* mare atenție , el este STRING și nu OBIECT JSON
*/

// El conține în clar acum șirul pentru autentificare ( vibob ) adică destinatarul pentru a cărui ochi este construit mesajul
// Înainte de a salva datele în fișierul HTML ce va fi vizibil pentru toată lumea, înlocuim acel șir

var mesaj_criptat_pentru_salvare = mesaj_criptat.replace(/"adata":"vibob"/,'"adata":"__USERNAME__"');

// Șirul mesaj_criptat_pentru_salvare îl salvăm în interiorul fișierului pe care-l dăm în HTML, în clar
. . .
// Mai târziu, când se încarcă fișierul în browser și trebuie decriptat
// Punem prima dată pe ecran un dialog cu input-uri din care culegem user_name și user_pass
// și pe butonul de login apelăm funcția de mai jos

function încearcăDecriptare(mesaj_criptat_salvat) {
  var succes           = false,
      mesaj_decriptat  = "plm",
      mesaj_rezultat   = "cioaca",
      obiect_decriptat = {},
      user_name, user_pass;
  try {
     // luăm user_name și user_pass din ce introduce el în input-urile din ecranul de login
     user_name = $("#user_name").val();
     user_pass = $("#user_pass").val();
     mesaj_decriptat = sjcl.decrypt(
          "user_pass",
          mesaj_criptat_salvat.replace(/__USERNAME__/,user_name),
          {adata:user_name}
     );
     // noi știm că am criptat un string JSON al unui obiect JavaScript
     obiect_decriptat = JSON.parse(mesaj_decriptat);
     if ( typeof obiect_decriptat === undefined || obiect_decriptat === null ) {
         mesaj_rezultat = "Eroare la parse";
     }
     succes         = true;
     mesaj_rezultat = "decriptare reușită";
  } catch (buleala) {
     // la eroare de decriptare gagii ies cu excepție, așa se capturează
     mesaj_rezultat = "Hai sictir, numele sau parola nu sunt bune!";
     console.error("Buleală la decriptare ",buleala);
  }
  return {
     "succes": succes,
     "mesaj_rezultat": mesaj_rezultat,
     "obiect_decriptat": obiect_decriptat
  }
}

Mai jos aveți probele din consola de la Google Chrome:

var obiect_de_criptat = {
  "numar_cerere":"BR000023",
  "solicitant":"Victor Ponta"
};
obiect_de_criptat
Object {numar_cerere: "BR000023", solicitant: "Victor Ponta"}
var mesaj_criptat = sjcl.encrypt("apia2014",JSON.stringify(obiect_de_criptat),{adata:"vibob",ks:256,mode:"ocb2",iter:5000});
mesaj_criptat
"{"iv":"JtRVAGfQ6MTOdYOuTwUp8g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"vibob","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ZDMYobYeZ92yuyfZsHwuM/uIucNOMJ5+hBuN6OxuNq1ogQxTg0SCtIWZr6porL93eB6CGyICIMxaeElE5wxu"}"
var mesaj_criptat_pentru_salvare = mesaj_criptat.replace(/"adata":"vibob"/,'__USERNAME__');
mesaj_criptat_pentru_salvare
"{"iv":"9+bxT91DygsDWLNhxuUc3g==","v":1,"iter":5000,"ks":256,"ts":64,"mode":"ocb2","adata":"__USERNAME__","cipher":"aes","salt":"VqYI32WAZwY=","ct":"ebPCMvyV+kithNlYfUY93cKOrduNYrNmCq8Qaos01lrAQEI9rLKnNT7yvNT3rdbftQjs8SI+o6wmcFVcCUmf"}"
console.log("Acum încercăm decriptarea cu diferiți iuzări și parole neștiute")
Acum încercăm decriptarea cu diferiți iuzări și parole neștiute
var mesaj_decriptat = sjcl.decrypt("apia2014",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"alexmocioi"),{adata:"alexmocioi"})


CORRUPT: ocb: tag doesn't match (chiar dacă iuzărul alexmocioi știe parola bună, nu se pupă "adata" în mesaj)
var mesaj_decriptat = sjcl.decrypt("numaiștiuparolasămăfutînea",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"vibob"),{adata:"vibob"})


CORRUPT: ocb: tag doesn't match (iuzărul vibob nu mai ține minte parola)
var mesaj_decriptat = sjcl.decrypt("apia2014",mesaj_criptat_pentru_salvare.replace(/__USERNAME__/,"vibob"),{adata:"vibob"})
mesaj_decriptat
"{"numar_cerere":"BR000023","solicitant":"Victor Ponta"}"
var obiect_decriptat = JSON.parse(mesaj_decriptat)
obiect_decriptat
Object {numar_cerere: "BR000023", solicitant: "Victor Ponta"}