npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

bit-shift-cipher

v1.0.0

Published

bit-shift vernam cipher for nodejs and the browser

Downloads

8

Readme

bit-shift-cipher

bit-shift vernam cipher for nodejs and the browser

the cipher cannot be cracked assuming the following:

  • The key is used only once
  • The key is not in anyway compromised

the following would not be advisable:

  • sending the ciphertext and key together over the same encrypted/unencrypted connection.
  • encrypting the key with another encryption algorithm and sending the ciphertext and key together over the same encrypted/unencrypted connection.

demo: https://angeal185.github.io/bit-shift-cipher/

Installation

npm

$ npm install bit-shift-cipher --save

bower

$ bower install bit-shift-cipher

git

$ git clone [email protected]:angeal185/bit-shift-cipher.git

nodejs


const bitShift = require('bit-shift-cipher');

browser


<script src="./dist/bitshift.min.js"></script>

API

//default options
{
  min: 0, // {integer} min shift
  max: 255, // {integer} max shift
  out: 'string', // {string/array/uint8} ~ default decrypt encoding string/array/uint8
  padding: [2,2], // {array/boolean} ~ prepend/append random padding. false to disable
  reverse: false, // reverse ciphertext
  iterations: 0 // rounds for ciphertext encrypt/decrypt (0-255)
}


const conf = {
  out: 'uint8'
},
bsc = new bitShift(conf),

/* encrypt */

/**
 *  sync ~ encrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/
bsc.encSync(plain,digest)



/**
 *  callback ~ encrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.enc(plain, digest, cb)


/**
 *  promise ~ encrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 **/
bsc.encP(plain, digest)


/* decrypt */

/**
 *  sync  ~ decrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be decrypted
 *  @param {string/byteArray/uint8Array} key ~ encryption key
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.decSync(plain, key, digest)


/**
 *  callback  ~ decrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be decrypted
 *  @param {string/byteArray/uint8Array} key ~ encryption key
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.dec(plain, key, digest, cb)


/**
 *  promise  ~ decrypt data
 *  @param {string/byteArray/uint8Array} plain ~ data to be encrypted
 *  @param {string/byteArray/uint8Array} key ~ encryption key
 *  @param {string} digest ~ encrypted data digest hex/bytes/binary/uint8/base64
 **/

bsc.decP(plain, key, digest)



/* encrypt with hmac and sign */

/**
 *  callback ~  encrypt and sign
 *  @param {string/byteArray/uint8Array} plain ~ data to encrypt
 *  @param {string/byteArray/uint8Array} hkey ~ hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.encHmac(plain, hkey, hash, digest, cb)


/**
 *  promise ~  encrypt and sign
 *  @param {string/byteArray/uint8Array} plain ~ data to encrypt
 *  @param {string/byteArray/uint8Array} hkey ~ hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64
 **/

bsc.encHmacP(plain, hkey, hash, digest)



/* verify hmac and decrypt */


/**
 *  callback ~  verify and decrypt
 *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt
 *  @param {string/byteArray/uint8Array} key ~ decrypt key
 *  @param {string/byteArray/uint8Array} hmac ~ hmac signature
 *  @param {string/byteArray/uint8Array} hkey ~ hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.decHmac(ctext, key, hmac, hkey, hash, digest, cb)


/**
 *  promise ~  verify and decrypt
 *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt
 *  @param {string/byteArray/uint8Array} key ~ decrypt key
 *  @param {string/byteArray/uint8Array} hmac ~ hmac signature
 *  @param {string/byteArray/uint8Array} hkey ~ hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac/data digest hex/bytes/binary/uint8/base64
 **/

bsc.decHmacP(ctext, key, hmac, hkey, hash, digest)



/* encrypt and sign with ecdsa */

/**
 *  callback ~  encrypt and sign
 *  @param {string/byteArray/uint8Array} plain ~ data to encrypt
 *  @param {object} ekey ~ ecdsa key (private jwk)
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.encEcdsa(plain, ekey, hash, digest, cb)


/**
 *  promise ~  encrypt and sign
 *  @param {string/byteArray/uint8Array} plain ~ data to encrypt
 *  @param {object} ekey ~ ecdsa key (private jwk)
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64
 **/

bsc.encEcdsaP(plain, ekey, hash, digest)



/* verify ecdsa and decrypt */


/**
 *  callback ~  verify and decrypt
 *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt
 *  @param {string/byteArray/uint8Array} key ~ decrypt key
 *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature
 *  @param {object} ekey ~ ecdsa key (public jwk)
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.decEcdsa(ctext, key, sig, ekey, hash, digest, cb)


/**
 *  promise ~  verify and decrypt
 *  @param {string/byteArray/uint8Array} ctext ~ data to decrypt
 *  @param {string/byteArray/uint8Array} key ~ decrypt key
 *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature
 *  @param {object} ekey ~ ecdsa key (public jwk)
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa/data digest hex/bytes/binary/uint8/base64
 **/

bsc.decEcdsaP(ctext, key, sig, ekey, hash, digest)



/* hmac */

/**
 *  callback ~ generate hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.hmac.gen(hash, digest, cb)


/**
 *  promise ~ generate hmac key
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 **/

bsc.hmac.genP(hash, digest)


/**
 *  callback ~ sign encrypted data
 *  @param {string/byteArray/uint8Array} key ~ hmac key
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.hmac.sign(key, ctext, hash, digest, cb)


/**
 *  promise ~ sign encrypted data
 *  @param {string/byteArray/uint8Array} key ~ hmac key
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 **/

bsc.hmac.signP(key, ctext, hash, digest)


/**
 *  callback ~ verify encrypted data
 *  @param {string/byteArray/uint8Array} key ~ hmac key
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string/byteArray/uint8Array} sig ~ hmac signature
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 **/

bsc.hmac.verify(key, ctext, sig, hash, digest, cb)


/**
 *  promise ~ verify encrypted data
 *  @param {string/byteArray/uint8Array} key ~ hmac key
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string/byteArray/uint8Array} sig ~ hmac signature
 *  @param {string} hash ~ hmac hash 256/384/512
 *  @param {string} digest ~ hmac key digest hex/bytes/binary/uint8/base64
 **/

bsc.hmac.verifyP(key, ctext, sig, hash, digest)


/* ecdsa */

/**
 *  callback ~ generate ecdsa keypair
 *  @param {string} curve ~ ecdsa curve '256'/'384'/'521'
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.ecdsa.gen(curve, cb)


/**
 *  promise ~ generate ecdsa keypair
 *  @param {string} curve ~ ecdsa curve '256'/'384'/'521'
 **/

bsc.ecdsa.genP(curve)


/**
 *  callback ~ sign encrypted data
 *  @param {object} key ~ ecdsa key (jwk)
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.ecdsa.sign(key, ctext, hash, digest, cb)


/**
 *  promise ~ sign encrypted data
 *  @param {object} key ~ ecdsa key (jwk)
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64
 **/

bsc.ecdsa.signP(key, ctext, hash, digest)


/**
 *  callback ~ verify signature
 *  @param {object} key ~ ecdsa key (jwk)
 *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64
 *  @param {function} cb ~ callback function(err,data)
 **/

bsc.ecdsa.verify(key, sig, ctext, hash, digest, cb)


/**
 *  promise ~ verify signature
 *  @param {object} key ~ ecdsa key (jwk)
 *  @param {string/byteArray/uint8Array} sig ~ ecdsa signature
 *  @param {string/byteArray/uint8Array} ctext ~ encrypted data
 *  @param {string} hash ~ ecdsa hash 256/384/512
 *  @param {string} digest ~ ecdsa sig digest hex/bytes/binary/uint8/base64
 **/

bsc.ecdsa.verifyP(key, sig, ctext, hash, digest)


/* utils */

bsc.utils.u82s(Uint8Array) // Uint8Array to string
bsc.utils.s2u8(string) // string to Uint8Array
bsc.utils.u82bin(byteArray) // byteArray to binary
bsc.utils.bin2u8(byteArray) // binary to byteArray
bsc.utils.u82a(uint8Array) // uint8Array to byteArray
bsc.utils.h2u8(i) // hex to Uint8Array
bsc.utils.u82h(i) // uint8Array to hex

bsc.utils.secRand(string) // prng single
bsc.utils.randomBytes(length) // prng filled Uint8Array

bsc.utils.isUint8(i) // check Uint8Array
bsc.utils.isArray(i) // check array
bsc.utils.isString(i) // check string
bsc.utils.isEqual(a,b)  // check if equal

bsc.utils.padIt(uint8Array, byteArray)  // add random padding to Uint8Array ~ [1,2]
bsc.utils.unPad(uint8Array, byteArray)  // remove padding from Uint8Array ~ [1,2]

/* demo */

const conf = {
  min: 0,
  max: 255,
  out: 'string'
},
bsc = new bitShift(conf),
utils = bsc.utils,
Digest = 'hex',
Hash = '256',
Curve = '521',
cl = console.log,
ce = console.error;


// enc/dec sync
let sync = bsc.encSync(text, Digest);
sync = bsc.decSync(sync.ctext, sync.key, Digest);
cl(sync);


// enc/dec callback
// encrypt data
bsc.enc(text, Digest,function(err, res){
  if(err){return ce(err)}
  // decrypt data
  bsc.dec(res.ctext, res.key, Digest, function(err, dec){
    if(err){return ce(err)}
    cl(dec)
  });
})

// enc/dec promise
// encrypt data
bsc.encP(text, Digest).then(function(res){
  // decrypt data
  bsc.decP(res.ctext, res.key, Digest).then(function(dec){
    cl(dec);
  }).catch(function(err){
    ce('promise dec test failure.')
  })
}).catch(function(err){
  ce(err)
})

// enc/dec with hmac callback
// generate key if needed
bsc.hmac.gen(Hash, Digest, function(err, hkey){
  // encrypt and sign
  bsc.encHmac(text, hkey, Hash, Digest, function(err, res){
    if(err){return ce(err)}
    // verify and decrypt
    bsc.decHmac(res.ctext, res.key, res.hmac, hkey, Hash, Digest, function(err, dec){
      if(err){return ce(err)}
      cl(dec)
    });
  });
})


// enc/dec hmac promise

//generate key if needed
bsc.hmac.gen(Hash, Digest, function(err, hkey){
  // encrypt and sign
  bsc.encHmacP(text, hkey, Hash, Digest)
  .then(function(res){
    // verify and decrypt
    bsc.decHmacP(res.ctext, res.key, res.hmac, hkey, Hash, Digest)
    .then(function(dec){
      cl(dec)
    }).catch(function(err){
      ce(err)
    })
  }).catch(function(err){
    ce(err)
  })
})


//hmac callback

//generate key
bsc.hmac.gen(Hash, Digest, function(err, key){
  if(err){return ce(err)}
  //sign data
  bsc.hmac.sign(key, text, Hash, Digest, function(err, sig){
    if(err){return ce(err)}
    // verify data
    bsc.hmac.verify(key, text, sig, Hash, Digest, function(err, isEqual){
      if(err){return ce(err)}
      cl(isEqual);
    })
  })
})

//hmac promise

//generate key
bsc.hmac.genP(Hash, Digest)
.then(function(key){
  //sign data
  bsc.hmac.signP(key, text, Hash, Digest)
  .then(function(sig){
    // verify data
    bsc.hmac.verifyP(key, text, sig, Hash, Digest)
      .then(function(isEqual){
        cl(isEqual);
      }).catch(function(err){
        ce(err)
      })
  }).catch(function(err){
    ce(err)
  })
}).catch(function(err){
  ce(err)
})




// ecdsa jwk gen callback
bsc.ecdsa.gen(Curve, function(err, ekey){
  // sign data
  bsc.ecdsa.sign(ekey.private, text, Hash, Digest, function(err, sig){
    if(err){return ce(err)}
    // verify data
    bsc.ecdsa.verify(ekey.public, sig, text, Hash, Digest, function(err, isEqual){
      if(err){return ce(err)}
      cl(isEqual)
    })
  })
})

// ecdsa jwk gen promise
bsc.ecdsa.genP(Curve)
.then(function(ekey){
  // sign data
  bsc.ecdsa.signP(ekey.private, text, Hash, Digest)
  .then(function(sig){
    // verify data
    bsc.ecdsa.verifyP(ekey.public, sig, text, Hash, Digest)
    .then(function(isEqual){
      cl(isEqual)
    }).catch(function(err){
      ce(err)
    })
  }).catch(function(err){
    ce(err)
  })
}).catch(function(err){
  ce(err)
})

// enc/dec with ecdsa callback
bsc.ecdsa.gen(Curve, function(err, ekey){
  // encrypt and sign data
  bsc.encEcdsa(text, ekey.private, Hash, Digest, function(err, res){
    if(err){return ce(err)}
    // verify and decrypt data
    bsc.decEcdsa(res.ctext, res.key, res.sig, ekey.public, Hash, Digest, function(err, dec){
      if(err){return ce(err)}
      cl(dec)
    });
  });
})


// enc/dec with ecdsa promise
bsc.ecdsa.genP(Curve)
.then(function(ekey){
  // encrypt and sign data
  bsc.encEcdsaP(text, ekey.private, Hash, Digest)
  .then(function(res){
    // verify and decrypt data
    bsc.decEcdsaP(res.ctext, res.key, res.sig, ekey.public, Hash, Digest)
    .then(function(dec){
      cl(dec)
    }).catch(function(err){
      ce(err)
    })
  }).catch(function(err){
    ce(err)
  })
}).catch(function(err){
  ce(err)
})