rc4.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. var base64 = require('./base64');
  2. var bytesToStr = require('./bytesToStr');
  3. var strToBytes = require('./strToBytes');
  4. exports = {
  5. encrypt: function(key, str) {
  6. return rc4(key, str, false);
  7. },
  8. decrypt: function(key, str) {
  9. return rc4(key, str, true);
  10. }
  11. };
  12. function rc4(key, str, decrypt) {
  13. key = strToBytes(key);
  14. if (!decrypt) {
  15. str = strToBytes(str);
  16. } else {
  17. str = base64.decode(str);
  18. }
  19. var result = [];
  20. var s = [];
  21. var j = 0;
  22. var i = 0;
  23. var x;
  24. for (i = 0; i < 256; i++) {
  25. s[i] = i;
  26. }
  27. for (i = 0; i < 256; i++) {
  28. j = (j + s[i] + key[i % key.length]) % 256;
  29. x = s[i];
  30. s[i] = s[j];
  31. s[j] = x;
  32. }
  33. i = 0;
  34. j = 0;
  35. for (var y = 0, len = str.length; y < len; y++) {
  36. i = (i + 1) % 256;
  37. j = (j + s[i]) % 256;
  38. x = s[i];
  39. s[i] = s[j];
  40. s[j] = x;
  41. result.push(str[y] ^ s[(s[i] + s[j]) % 256]);
  42. }
  43. return !decrypt ? base64.encode(result) : bytesToStr(result);
  44. }
  45. module.exports = exports;