Created
August 18, 2024 09:47
-
-
Save SatoshiMota/38d72045fc6c0719b2e6463896ac1756 to your computer and use it in GitHub Desktop.
MetaMask encrypts decrypts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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