Для использования требуется NodeJS с установленным пакетом Crypto.
Расшифровывает кошелек при помощи пароля от кошелька.
Зашифрованный кошелек можно получить при помощи ID от BlockChain.
Кому надо - большого труда разобраться не будет думаю., ибо самое сложное уже реализовано за вас.
Разбирал Blockchain еще примерно пол год назад - мне не понадобилось, надеюсь кого то заинтересует.
Расшифровывает кошелек при помощи пароля от кошелька.
Зашифрованный кошелек можно получить при помощи ID от BlockChain.
Кому надо - большого труда разобраться не будет думаю., ибо самое сложное уже реализовано за вас.
JavaScript:
let payload;
let password;
let pbkdf2_iterations = 5000;
let SALT_BYTES = 16;
let KEY_BIT_LEN = 256;
let BLOCK_BIT_LEN = 128;
let ALGO = {
SHA1: "sha1",
SHA256: "sha256"
};
const crypto = require('crypto');
let Iso10126 = {
pad: function pad(dataBytes, nBytesPerBlock) {
var nPaddingBytes = nBytesPerBlock - dataBytes.length % nBytesPerBlock;
var paddingBytes = crypto.randomBytes(nPaddingBytes - 1);
var endByte = new Buffer([nPaddingBytes]);
return Buffer.concat([dataBytes, paddingBytes, endByte])
},
unpad: function unpad(dataBytes) {
var nPaddingBytes = dataBytes[dataBytes.length - 1];
return dataBytes.slice(0, -nPaddingBytes)
}
};
let AES = {
CBC: "aes-256-cbc",
OFB: "aes-256-ofb",
ECB: "aes-256-ecb",
encrypt: function encrypt(dataBytes, key, salt, options) {
options = options || {};
var cipher = crypto.createCipheriv(options.mode || AES.CBC, key, salt || "");
cipher.setAutoPadding(!options.padding);
if (options.padding) dataBytes = options.padding.pad(dataBytes, BLOCK_BIT_LEN / 8);
var encryptedBytes = Buffer.concat([cipher.update(dataBytes), cipher.final()]);
return encryptedBytes
},
decrypt: function decrypt(dataBytes, key, salt, options) {
options = options || {};
var decipher = crypto.createDecipheriv(options.mode || AES.CBC, key, salt || "");
decipher.setAutoPadding(!options.padding);
var decryptedBytes = Buffer.concat([decipher.update(dataBytes), decipher.final()]);
if (options.padding) decryptedBytes = options.padding.unpad(decryptedBytes);
return decryptedBytes
}
};
function decryptBufferWithKey(payload, iv, key, options) {
options = options || {};
options.padding = options.padding || Iso10126;
var decryptedBytes = AES.decrypt(payload, key, iv, options);
return decryptedBytes.toString("utf8")
}
function pbkdf2(password, salt, iterations, keyLenBytes, algorithm) {
algorithm = algorithm || ALGO.SHA1;
return crypto.pbkdf2Sync(password, salt, iterations, keyLenBytes, algorithm);
}
function stretchPassword(password, salt, iterations, keyLenBits) {
var saltBuffer = new Buffer(salt, "hex");
var keyLenBytes = (keyLenBits || 256) / 8;
return pbkdf2(password, saltBuffer, iterations, keyLenBytes, ALGO.SHA1)
}
function decryptDataWithPassword(data, password, iterations, options) {
var dataHex = new Buffer(data, "base64");
var iv = dataHex.slice(0, SALT_BYTES);
var payload = dataHex.slice(SALT_BYTES);
var salt = iv;
var key = stretchPassword(password, salt, iterations, KEY_BIT_LEN);
var res = decryptBufferWithKey(payload, iv, key, options);
return res
}
var decrypted = decryptDataWithPassword(payload, password, pbkdf2_iterations);
Разбирал Blockchain еще примерно пол год назад - мне не понадобилось, надеюсь кого то заинтересует.