static createDecipher(cryptoScheme, dataKey, offset, log, cb) {
        this._deriveKey(
            cryptoScheme, dataKey, log,
            (err, derivedKey, derivedIV) => {
                if (err) {
                    log.debug('key derivation failed', { error: err });
                    return cb(err);
                }
                const aesBlockSize = this._aesBlockSize();
                const blocks = Math.floor(offset / aesBlockSize);
                const toSkip = offset % aesBlockSize;
                const iv = this._incrementIV(derivedIV, blocks);
                const cipher = crypto.createDecipheriv(this._algorithm(),
                                                       derivedKey, iv);
                if (toSkip) {
                    /* Above, we advanced to the latest boundary not
                    greater than the offset amount. Here we advance by
                    the toSkip amount if necessary. */
                    const dummyBuffer = Buffer.alloc(toSkip);
                    cipher.write(dummyBuffer);
                    cipher.read();
                }
                return cb(null, cipher);
            });
    }
createDecipher
@param {number} cryptoScheme - cryptoScheme being used
@param {buffer} dataKey - the unencrypted key (either from the
appliance on a get or originally generated by kms in the case of a put)
@param {number} offset - offset
@param {object} log - logger object
@param {function} cb - cb from external call
@returns {undefined}
@callback called with (err, decipher: ReadWritable.stream)