{"id":16416659,"url":"https://github.com/angeal185/bit-shift-cipher","last_synced_at":"2025-02-24T11:19:34.272Z","repository":{"id":58244419,"uuid":"188158922","full_name":"angeal185/bit-shift-cipher","owner":"angeal185","description":"bit-shift vernam cipher for nodejs and the browser","archived":false,"fork":false,"pushed_at":"2019-05-25T06:30:46.000Z","size":59,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-06T18:11:44.929Z","etag":null,"topics":["algorithm","cipher","decryption","encryption","vernam-cipher"],"latest_commit_sha":null,"homepage":"https://angeal185.github.io/bit-shift-cipher","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/angeal185.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-23T04:00:13.000Z","updated_at":"2019-05-25T06:26:22.000Z","dependencies_parsed_at":"2022-08-31T00:31:31.091Z","dependency_job_id":null,"html_url":"https://github.com/angeal185/bit-shift-cipher","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angeal185%2Fbit-shift-cipher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angeal185%2Fbit-shift-cipher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angeal185%2Fbit-shift-cipher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angeal185%2Fbit-shift-cipher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/angeal185","download_url":"https://codeload.github.com/angeal185/bit-shift-cipher/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240466791,"owners_count":19805862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","cipher","decryption","encryption","vernam-cipher"],"created_at":"2024-10-11T07:09:47.567Z","updated_at":"2025-02-24T11:19:34.253Z","avatar_url":"https://github.com/angeal185.png","language":"JavaScript","readme":"# bit-shift-cipher\n\nbit-shift vernam cipher for nodejs and the browser\n\nthe cipher cannot be cracked assuming the following:\n* The key is used only once\n* The key is not in anyway compromised\n\nthe following would not be advisable:\n* sending the ciphertext and key together over the same\n  encrypted/unencrypted connection.\n* encrypting the key with another encryption algorithm\n  and sending the ciphertext and key together over the same\n  encrypted/unencrypted connection.\n\n\ndemo: https://angeal185.github.io/bit-shift-cipher/\n\n### Installation\n\nnpm\n\n```sh\n$ npm install bit-shift-cipher --save\n```\n\nbower\n\n```sh\n$ bower install bit-shift-cipher\n```\n\ngit\n```sh\n$ git clone git@github.com:angeal185/bit-shift-cipher.git\n```\n\n\n#### nodejs\n\n```js\n\nconst bitShift = require('bit-shift-cipher');\n\n```\n\n#### browser\n\n```html\n\n\u003cscript src=\"./dist/bitshift.min.js\"\u003e\u003c/script\u003e\n\n```\n\n\n\n#### API\n\n```js\n//default options\n{\n  min: 0, // {integer} min shift\n  max: 255, // {integer} max shift\n  out: 'string', // {string/array/uint8} ~ default decrypt encoding string/array/uint8\n  padding: [2,2], // {array/boolean} ~ prepend/append random padding. false to disable\n  reverse: false, // reverse ciphertext\n  iterations: 0 // rounds for ciphertext encrypt/decrypt (0-255)\n}\n\n\nconst conf = {\n  out: 'uint8'\n},\nbsc = new bitShift(conf),\n\n/* encrypt */\n\n/**\n *  sync ~ encrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\nbsc.encSync(plain,digest)\n\n\n\n/**\n *  callback ~ encrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.enc(plain, digest, cb)\n\n\n/**\n *  promise ~ encrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n **/\nbsc.encP(plain, digest)\n\n\n/* decrypt */\n\n/**\n *  sync  ~ decrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be decrypted\n *  @param {string/byteArray/uint8Array} key ~ encryption key\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.decSync(plain, key, digest)\n\n\n/**\n *  callback  ~ decrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be decrypted\n *  @param {string/byteArray/uint8Array} key ~ encryption key\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.dec(plain, key, digest, cb)\n\n\n/**\n *  promise  ~ decrypt data\n *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted\n *  @param {string/byteArray/uint8Array} key ~ encryption key\n *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.decP(plain, key, digest)\n\n\n\n/* encrypt with hmac and sign */\n\n/**\n *  callback ~  encrypt and sign\n *  @param {string/byteArray/uint8Array} plain ~ data to encrypt\n *  @param {string/byteArray/uint8Array} hkey ~ hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.encHmac(plain, hkey, hash, digest, cb)\n\n\n/**\n *  promise ~  encrypt and sign\n *  @param {string/byteArray/uint8Array} plain ~ data to encrypt\n *  @param {string/byteArray/uint8Array} hkey ~ hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.encHmacP(plain, hkey, hash, digest)\n\n\n\n/* verify hmac and decrypt */\n\n\n/**\n *  callback ~  verify and decrypt\n *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt\n *  @param {string/byteArray/uint8Array} key ~ decrypt key\n *  @param {string/byteArray/uint8Array} hmac ~ hmac signature\n *  @param {string/byteArray/uint8Array} hkey ~ hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.decHmac(ctext, key, hmac, hkey, hash, digest, cb)\n\n\n/**\n *  promise ~  verify and decrypt\n *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt\n *  @param {string/byteArray/uint8Array} key ~ decrypt key\n *  @param {string/byteArray/uint8Array} hmac ~ hmac signature\n *  @param {string/byteArray/uint8Array} hkey ~ hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.decHmacP(ctext, key, hmac, hkey, hash, digest)\n\n\n\n/* encrypt and sign with ecdsa */\n\n/**\n *  callback ~  encrypt and sign\n *  @param {string/byteArray/uint8Array} plain ~ data to encrypt\n *  @param {object} ekey ~ ecdsa key (private jwk)\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.encEcdsa(plain, ekey, hash, digest, cb)\n\n\n/**\n *  promise ~  encrypt and sign\n *  @param {string/byteArray/uint8Array} plain ~ data to encrypt\n *  @param {object} ekey ~ ecdsa key (private jwk)\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.encEcdsaP(plain, ekey, hash, digest)\n\n\n\n/* verify ecdsa and decrypt */\n\n\n/**\n *  callback ~  verify and decrypt\n *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt\n *  @param {string/byteArray/uint8Array} key ~ decrypt key\n *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature\n *  @param {object} ekey ~ ecdsa key (public jwk)\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.decEcdsa(ctext, key, sig, ekey, hash, digest, cb)\n\n\n/**\n *  promise ~  verify and decrypt\n *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt\n *  @param {string/byteArray/uint8Array} key ~ decrypt key\n *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature\n *  @param {object} ekey ~ ecdsa key (public jwk)\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.decEcdsaP(ctext, key, sig, ekey, hash, digest)\n\n\n\n/* hmac */\n\n/**\n *  callback ~ generate hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.hmac.gen(hash, digest, cb)\n\n\n/**\n *  promise ~ generate hmac key\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.hmac.genP(hash, digest)\n\n\n/**\n *  callback ~ sign encrypted data\n *  @param {string/byteArray/uint8Array} key ~ hmac key\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.hmac.sign(key, ctext, hash, digest, cb)\n\n\n/**\n *  promise ~ sign encrypted data\n *  @param {string/byteArray/uint8Array} key ~ hmac key\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.hmac.signP(key, ctext, hash, digest)\n\n\n/**\n *  callback ~ verify encrypted data\n *  @param {string/byteArray/uint8Array} key ~ hmac key\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string/byteArray/uint8Array} sig ~ hmac signature\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.hmac.verify(key, ctext, sig, hash, digest, cb)\n\n\n/**\n *  promise ~ verify encrypted data\n *  @param {string/byteArray/uint8Array} key ~ hmac key\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string/byteArray/uint8Array} sig ~ hmac signature\n *  @param {string} hash ~ hmac hash 256/384/512\n *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.hmac.verifyP(key, ctext, sig, hash, digest)\n\n\n/* ecdsa */\n\n/**\n *  callback ~ generate ecdsa keypair\n *  @param {string} curve ~ ecdsa curve '256'/'384'/'521'\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.ecdsa.gen(curve, cb)\n\n\n/**\n *  promise ~ generate ecdsa keypair\n *  @param {string} curve ~ ecdsa curve '256'/'384'/'521'\n **/\n\nbsc.ecdsa.genP(curve)\n\n\n/**\n *  callback ~ sign encrypted data\n *  @param {object} key ~ ecdsa key (jwk)\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.ecdsa.sign(key, ctext, hash, digest, cb)\n\n\n/**\n *  promise ~ sign encrypted data\n *  @param {object} key ~ ecdsa key (jwk)\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.ecdsa.signP(key, ctext, hash, digest)\n\n\n/**\n *  callback ~ verify signature\n *  @param {object} key ~ ecdsa key (jwk)\n *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64\n *  @param {function} cb ~ callback function(err,data)\n **/\n\nbsc.ecdsa.verify(key, sig, ctext, hash, digest, cb)\n\n\n/**\n *  promise ~ verify signature\n *  @param {object} key ~ ecdsa key (jwk)\n *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature\n *  @param {string/byteArray/uint8Array} ctext ~ encrypted data\n *  @param {string} hash ~ ecdsa hash 256/384/512\n *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64\n **/\n\nbsc.ecdsa.verifyP(key, sig, ctext, hash, digest)\n\n\n/* utils */\n\nbsc.utils.u82s(Uint8Array) // Uint8Array to string\nbsc.utils.s2u8(string) // string to Uint8Array\nbsc.utils.u82bin(byteArray) // byteArray to binary\nbsc.utils.bin2u8(byteArray) // binary to byteArray\nbsc.utils.u82a(uint8Array) // uint8Array to byteArray\nbsc.utils.h2u8(i) // hex to Uint8Array\nbsc.utils.u82h(i) // uint8Array to hex\n\nbsc.utils.secRand(string) // prng single\nbsc.utils.randomBytes(length) // prng filled Uint8Array\n\nbsc.utils.isUint8(i) // check Uint8Array\nbsc.utils.isArray(i) // check array\nbsc.utils.isString(i) // check string\nbsc.utils.isEqual(a,b)  // check if equal\n\nbsc.utils.padIt(uint8Array, byteArray)  // add random padding to Uint8Array ~ [1,2]\nbsc.utils.unPad(uint8Array, byteArray)  // remove padding from Uint8Array ~ [1,2]\n\n/* demo */\n\nconst conf = {\n  min: 0,\n  max: 255,\n  out: 'string'\n},\nbsc = new bitShift(conf),\nutils = bsc.utils,\nDigest = 'hex',\nHash = '256',\nCurve = '521',\ncl = console.log,\nce = console.error;\n\n\n// enc/dec sync\nlet sync = bsc.encSync(text, Digest);\nsync = bsc.decSync(sync.ctext, sync.key, Digest);\ncl(sync);\n\n\n// enc/dec callback\n// encrypt data\nbsc.enc(text, Digest,function(err, res){\n  if(err){return ce(err)}\n  // decrypt data\n  bsc.dec(res.ctext, res.key, Digest, function(err, dec){\n    if(err){return ce(err)}\n    cl(dec)\n  });\n})\n\n// enc/dec promise\n// encrypt data\nbsc.encP(text, Digest).then(function(res){\n  // decrypt data\n  bsc.decP(res.ctext, res.key, Digest).then(function(dec){\n    cl(dec);\n  }).catch(function(err){\n    ce('promise dec test failure.')\n  })\n}).catch(function(err){\n  ce(err)\n})\n\n// enc/dec with hmac callback\n// generate key if needed\nbsc.hmac.gen(Hash, Digest, function(err, hkey){\n  // encrypt and sign\n  bsc.encHmac(text, hkey, Hash, Digest, function(err, res){\n    if(err){return ce(err)}\n    // verify and decrypt\n    bsc.decHmac(res.ctext, res.key, res.hmac, hkey, Hash, Digest, function(err, dec){\n      if(err){return ce(err)}\n      cl(dec)\n    });\n  });\n})\n\n\n// enc/dec hmac promise\n\n//generate key if needed\nbsc.hmac.gen(Hash, Digest, function(err, hkey){\n  // encrypt and sign\n  bsc.encHmacP(text, hkey, Hash, Digest)\n  .then(function(res){\n    // verify and decrypt\n    bsc.decHmacP(res.ctext, res.key, res.hmac, hkey, Hash, Digest)\n    .then(function(dec){\n      cl(dec)\n    }).catch(function(err){\n      ce(err)\n    })\n  }).catch(function(err){\n    ce(err)\n  })\n})\n\n\n//hmac callback\n\n//generate key\nbsc.hmac.gen(Hash, Digest, function(err, key){\n  if(err){return ce(err)}\n  //sign data\n  bsc.hmac.sign(key, text, Hash, Digest, function(err, sig){\n    if(err){return ce(err)}\n    // verify data\n    bsc.hmac.verify(key, text, sig, Hash, Digest, function(err, isEqual){\n      if(err){return ce(err)}\n      cl(isEqual);\n    })\n  })\n})\n\n//hmac promise\n\n//generate key\nbsc.hmac.genP(Hash, Digest)\n.then(function(key){\n  //sign data\n  bsc.hmac.signP(key, text, Hash, Digest)\n  .then(function(sig){\n    // verify data\n    bsc.hmac.verifyP(key, text, sig, Hash, Digest)\n      .then(function(isEqual){\n        cl(isEqual);\n      }).catch(function(err){\n        ce(err)\n      })\n  }).catch(function(err){\n    ce(err)\n  })\n}).catch(function(err){\n  ce(err)\n})\n\n\n\n\n// ecdsa jwk gen callback\nbsc.ecdsa.gen(Curve, function(err, ekey){\n  // sign data\n  bsc.ecdsa.sign(ekey.private, text, Hash, Digest, function(err, sig){\n    if(err){return ce(err)}\n    // verify data\n    bsc.ecdsa.verify(ekey.public, sig, text, Hash, Digest, function(err, isEqual){\n      if(err){return ce(err)}\n      cl(isEqual)\n    })\n  })\n})\n\n// ecdsa jwk gen promise\nbsc.ecdsa.genP(Curve)\n.then(function(ekey){\n  // sign data\n  bsc.ecdsa.signP(ekey.private, text, Hash, Digest)\n  .then(function(sig){\n    // verify data\n    bsc.ecdsa.verifyP(ekey.public, sig, text, Hash, Digest)\n    .then(function(isEqual){\n      cl(isEqual)\n    }).catch(function(err){\n      ce(err)\n    })\n  }).catch(function(err){\n    ce(err)\n  })\n}).catch(function(err){\n  ce(err)\n})\n\n// enc/dec with ecdsa callback\nbsc.ecdsa.gen(Curve, function(err, ekey){\n  // encrypt and sign data\n  bsc.encEcdsa(text, ekey.private, Hash, Digest, function(err, res){\n    if(err){return ce(err)}\n    // verify and decrypt data\n    bsc.decEcdsa(res.ctext, res.key, res.sig, ekey.public, Hash, Digest, function(err, dec){\n      if(err){return ce(err)}\n      cl(dec)\n    });\n  });\n})\n\n\n// enc/dec with ecdsa promise\nbsc.ecdsa.genP(Curve)\n.then(function(ekey){\n  // encrypt and sign data\n  bsc.encEcdsaP(text, ekey.private, Hash, Digest)\n  .then(function(res){\n    // verify and decrypt data\n    bsc.decEcdsaP(res.ctext, res.key, res.sig, ekey.public, Hash, Digest)\n    .then(function(dec){\n      cl(dec)\n    }).catch(function(err){\n      ce(err)\n    })\n  }).catch(function(err){\n    ce(err)\n  })\n}).catch(function(err){\n  ce(err)\n})\n\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangeal185%2Fbit-shift-cipher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangeal185%2Fbit-shift-cipher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangeal185%2Fbit-shift-cipher/lists"}