Skip to content

Instantly share code, notes, and snippets.

@SatoshiMota
Created August 18, 2024 09:47
Show Gist options
  • Save SatoshiMota/38d72045fc6c0719b2e6463896ac1756 to your computer and use it in GitHub Desktop.
Save SatoshiMota/38d72045fc6c0719b2e6463896ac1756 to your computer and use it in GitHub Desktop.
MetaMask encrypts decrypts
// node 13-MetaMask_encrypt_decrypt.js
const crypto = require('crypto');
// Функция для извлечения значения между двумя ключами
function extractValueBetweenKeys(data, startKey, endKey) {
const regex = new RegExp(`${startKey}(.*?)${endKey}`, 's');
const match = data.match(regex);
return match ? match[1] : null;
}
// Шифрование Metamask
function encryptMetamask(password, mnemonic) {
// Генерация salt размером MM
const salt = crypto.randomBytes(32);
// Создание ключа из пароля (длиной 32 байта)
const key = crypto.pbkdf2Sync(password, salt, 600000, 32, 'sha256');
// Генерация iv размером MM
const iv = crypto.randomBytes(16);
// Создание объекта с алгоритмом AES-256-GCM
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
// Преобразование сид-фразы в массив ASCII-кодов
const mnemonicArray = Array.from(mnemonic).map(char => char.charCodeAt(0));
// Создание данных в формате MM
const data = `[{"type":"HD Key Tree","data":{"mnemonic":[${mnemonicArray}],"numberOfAccounts":1,"hdPath":"m/44'/60'/0'/0"}}]`;
// Шифрования данных алгоритмом AES-256-GCM
const encryptedData = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);
// Получение тега авторизации
const tag = cipher.getAuthTag();
// Обьединение зашифрованной сид-фразы и тега в формат MM
const mmData = Buffer.from(encryptedData.toString('hex') + tag.toString('hex'), 'hex');
// Конвертация в формат MM
console.log(
`"KeyringController":{"vault":"{\\"data\\":\\"${mmData.toString('base64')}\\",\\"iv\\":\\"${iv.toString('base64')}\\",\\"keyMetadata\\":{\\"algorithm\\":\\"PBKDF2\\",\\"params\\":{\\"iterations\\":600000}},\\"salt\\":\\"${salt.toString('base64')}\\"}"}`
);
}
// Расшифровка Metamask
function decryptMetamask(password, allData) {
// Парсинг и конвертация из base64 в buffer формат
const data = Buffer.from(extractValueBetweenKeys(allData, '"data":"', '","iv"'), 'base64');
const iv = Buffer.from(extractValueBetweenKeys(allData, '"iv":"', '","keyMetadata"'), 'base64');
const salt = Buffer.from(extractValueBetweenKeys(allData, '"salt":"', '"}'), 'base64');
// Извлечение тега из даты
const authTag = data.slice(-16);
const encryptedData = data.slice(0, -16);
// Создание ключа из пароля (длиной 32 байта)
const key = crypto.pbkdf2Sync(password, salt, 600000, 32, 'sha256');
// Создание объекта с алгоритмом AES-256-GCM (установка тега для проверки)
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
decipher.setAuthTag(authTag);
// Расшифрование данных алгоритмом AES-256-GCM
const decrypted = Buffer.concat([decipher.update(encryptedData), decipher.final()]);
// Извлечение сид-фразы в формате ascii
const mnemonicArray = JSON.parse(decrypted)[0].data.mnemonic;
// Преобразование массива ASCII-кодов в сид-фразу
const mnemonic = mnemonicArray.map(code => String.fromCharCode(code)).join('');
console.log(mnemonic);
}
const password = "";
const mnemonic = "";
// encryptMetamask(password, mnemonic);
const allData = ``;
// decryptMetamask(password, allData);
// const test_mnemonic = "action stereo material want reason carbon return buffalo oblige pottery tomato good";
// const test_allData = `"KeyringController":{"vault":"{\"data\":\"KVet20Fb2bFUGT4sfB+tnsiFABdC/gT4GhzXjoMvZSvWciWt5FstBE11XbJ09G9DgFIRHXRL7ivw9FqmBtC1zj2XMH3nsO5s0cnGEJh0c25QzsH6ktXGqsp9LUZoC8FrViue16FHkLQ99YCnSka3nOvOT3ndQc2vH6z/ksjq2EEBJY/il3gQn9QZ0Sk9qwhx2dKGE5pj1Sop8pBfRNcvGuQK78dLDBoWcBb6pUEjO+a6lAM2baAKRfkkclf/BmRlWUBls8rwkYcZnwdDbfysrsdP9MVNqwfUmUpym6EvJZfbW8lVEzOtPMaKhDKEHy78TXri+1V/rybG86ryfri/7+nPjWvcYMXsHD4kx6KhDdVhPjXCV5DqQiu3y2mJcKAh6v1yCNRUOm6Cz1K/BZ0WHm531U8fsGiQn7wPeCyEbib619TCBaDVtJAUr5agulaHWr2r6jsTbcWmsOrmBL4t3Y+CMM+tkp6qt3EzFWcChqORm1M8NYF/kJ3XLByMD9KFDsIWx23tdmPTG+inYIj2yZkbaMH+PcWqZ3mMXoACvDf7\",\"iv\":\"TQFsp3uccmon3fDq3SVoJQ==\",\"keyMetadata\":{\"algorithm\":\"PBKDF2\",\"params\":{\"iterations\":600000}},\"salt\":\"id/YiHVz9Y4NIFzSniexnHaaaIOssTpMzvyGdCtdb4s=\"}"}`;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment