rncryptor.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. var RNCryptor = {};
  2. /*
  3. Takes password string and salt WordArray
  4. Returns key WordArray
  5. */
  6. RNCryptor.KeyForPassword = function(password, salt) {
  7. return CryptoJS.PBKDF2(password, salt, { keySize: 256/32, iterations: 1000 });
  8. }
  9. /*
  10. Takes password string and plaintext WordArray
  11. options:
  12. iv
  13. encryption_salt
  14. html_salt
  15. Returns ciphertext WordArray
  16. */
  17. RNCryptor.Encrypt = function(password, plaintext, options) {
  18. options = options || {}
  19. var encryption_salt = options["encryption_salt"] || CryptoJS.lib.WordArray.random(64/8);
  20. var encryption_key = RNCryptor.KeyForPassword(password, encryption_salt);
  21. var hmac_salt = options["hmac_salt"] || CryptoJS.lib.WordArray.random(64/8)
  22. var hmac_key = RNCryptor.KeyForPassword(password, hmac_salt);
  23. var iv = options["iv"] || CryptoJS.lib.WordArray.random(64/8)
  24. var version = CryptoJS.enc.Hex.parse("03");
  25. var options = CryptoJS.enc.Hex.parse("01");
  26. var message = version.clone();
  27. message.concat(options);
  28. message.concat(encryption_salt);
  29. message.concat(hmac_salt);
  30. message.concat(iv);
  31. var encrypted = CryptoJS.AES.encrypt(plaintext, encryption_key, {iv: iv});
  32. message.concat(encrypted.ciphertext);
  33. var hmac = CryptoJS.HmacSHA256(message, hmac_key);
  34. message.concat(hmac);
  35. return message;
  36. }