TGViewer
Понакодили Понакодили @nacodili · 118 subscribers
Post #9 445
Недавно прочитал новость про неслучайные сид-фразы: https://t.me/ctodaily/2117
И решил попробовать поискать TON-разработчиков, которые поленились нормально сгенерировать приватный ключ.

Моё предположение было такое: в библиотеке @ton/crypto есть функция keyPairFromSeed(seed), где seed — это Buffer длиной 32 байта.
Правильно этот сид надо создавать так getSecureRandomBytes(32). Но так будет возня байтами, куда-то их придется сохранить. В общем, делать хорошо — сложно.

А еще, можно написать как-то так:

const keyPair = keyPairFromSeed(await sha256('my_secret'));


Тут my_secret может быть любой строкой, а sha256 сделает из неё хеш длиной 32 байта — как раз то, что требует keyPairFromSeed.

Идея такая: берём популярные пароли, считаем от них sha256-хеш, создаём ключ из этого сида и смотрим, есть ли кошельки c такими ключами в блокчейне.

Найти популярные пароли оказалось проще всего: есть репозиторий https://github.com/danielmiessler/SecLists/tree/master/Passwords, там собрано примерно 56 миллионов паролей. Правда, лежат они в разных файлах, но это не большая проблема.

Дальше я начал думать, как проверить, существует ли кошелёк в блокчейне. Первой идеей было взять бесплатные ключи для tonapi, toncenter и подобных сервисов и просто проверять баланс адреса: если не ноль, то считаем, что кошелёк найден. Но при таком подходе скорость перебора была бы очень низкой.

К счастью, что у tonapi есть крутой сервис TON Analytics. Суть в том, что можно делать SQL-запросы в их базу данных. На текущий момент разрешено создавать запросы, которые отдают миллион строк за раз. В TON всего ~190 миллионов активных адресов, так что выгрузить их все не составило труда и обошлось мне примерно в $20.

Кроме самих адресов, у них есть ещё и отдельная таблица с публичными ключами — там оказалось примерно 50 миллионов ключей. Эта таблица существенно облегчает поиск, потому что не надо генерировать адрес TON-кошелька, а можно проверить сразу публичный ключ. Без неё пришлось бы сначала сгенерировать адреса кошельков для разных версий (v3, v5, hl_v2, hl_v3) и проверять каждый адрес отдельно.

Дальше я попросил Claude написать мне скрипт на Rust. На удивление, получилось с первого раза.

В итоге я проверил:

- 56 миллионов самых популярных паролей;
- unix timestamp с текущего момента до начала 2022 года (134 миллиона чисел);
- просто все числа от 0 до 10 миллионов.

И нашёл только два адреса:

1. EQD36D7ngLSsURYGsDhGzRGrMPPBLs2U2WLDP_THFPvQy6Np — тут приватный ключ создан из слова storm.
2. EQDEW3qkxdgj20mymJ6hPX8AafSzGmT_epYAnOmtuzt9lM6b — тут из строки 1.3.. Оказывается, этот кошелёк создавал я сам :)

На этих кошельках нулевой баланс, видно что они использовались только один раз несколько лет назад.

Дальше искать адреса мне надоело, я потратил несколько дней на проверку всех 190 миллионов строк. Xотя еще много чего можно попробовать, брать другие хеши или применять хеш несколько раз.

Создавайте ключи правильно
  • 🔥 9
  • 👍 3
  • 🕊 1
More from @nacodili
  1. Sep 17, 2026Это, наверное, самый безобидный баг, но мерзкий. Проявляется он так: dApp вызывает кошелек…
  2. Sep 17, 2026Последние 4 года я занимаюсь проектами на TON. Я участвовал в разработке Getgems, Lost Dog…
  3. Sep 16, 2026Post #11
  4. Aug 26, 2026Как я починил fragment Просто пополнил баланс нфт на 0.005 GRAM. После этого нфт хватило д…
  5. May 8, 2026TON не любит нищих TON сделан таким образом, чтобы вы не задавались вопросом: «Ой, а хвати…
  6. Dec 26, 2025Сегодня я узнал, что в func нельзя написать много условий подряд, компилятор из @ton-commu…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →