mirror of
https://github.com/curly60e/pyblock.git
synced 2026-08-13 12:33:15 +02:00
Security (Critical): - Eliminate all shell=True command injection vectors (~95 instances in ppi.py, spvblock.py) - Replace subprocess curl calls with requests library - Add input validation (fiat code allowlist, IP address validation) - Replace weak random.randint/choice with secrets module for crypto ops - Remove token/credential exposure from print statements - Add path traversal prevention in config.py - Create .conf.example templates, scrub local credentials Stability: - Replace 63 bare except clauses with specific exceptions + logging - Fix file handle leaks with context managers (lnd.py, apisnd.py) - Add threading.Lock for race conditions in clock/data.py - Cap unbounded list growth (MAX_HISTORY_LEN=50) - Add timeout=10 to ~50 requests calls missing timeouts Maintainability: - Extract _load_macaroon() helper (dedup 69 instances in PyBlock.py) - Extract _load_lnd_config() helper (dedup 33 instances in nodeconnection.py) - Normalize json import (simplejson with stdlib fallback) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
import hashlib
|
|
import random
|
|
import secrets
|
|
import string
|
|
import time
|
|
import curses
|
|
|
|
def sha256_hash(input_data):
|
|
sha256 = hashlib.sha256()
|
|
sha256.update(input_data.encode())
|
|
return sha256.hexdigest()
|
|
|
|
def binario_de_hexadecimal(hex_string):
|
|
"""Convierte una cadena hexadecimal en una cadena binaria."""
|
|
return bin(int(hex_string, 16))[2:].zfill(len(hex_string) * 4)
|
|
|
|
def binario_a_hex(binario):
|
|
"""Convierte una cadena binaria en una cadena hexadecimal."""
|
|
return hex(int(binario, 2))[2:].zfill(64)
|
|
|
|
def generar_cadena_aleatoria(longitud=6):
|
|
letras = string.ascii_lowercase
|
|
return ''.join(secrets.choice(letras) for i in range(longitud))
|
|
|
|
def mainSHA(stdscr):
|
|
curses.curs_set(0) # Oculta el cursor
|
|
input_data = generar_cadena_aleatoria()
|
|
ciclo = 1
|
|
|
|
curses.curs_set(0) # Oculta el cursor
|
|
curses.start_color()
|
|
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
|
|
curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK)
|
|
curses.init_pair(3, curses.COLOR_CYAN, curses.COLOR_BLACK)
|
|
curses.init_pair(4, curses.COLOR_MAGENTA, curses.COLOR_BLACK)
|
|
curses.init_pair(5, curses.COLOR_RED, curses.COLOR_BLACK)
|
|
|
|
while True:
|
|
stdscr.clear()
|
|
|
|
# Convertir input a ASCII y luego a binario
|
|
valores_ascii = [ord(c) for c in input_data]
|
|
valores_binarios = [bin(v)[2:].zfill(8) for v in valores_ascii]
|
|
mensaje_binario = ''.join(valores_binarios)
|
|
|
|
# Calcular hash SHA-256 del mensaje
|
|
hash_resultado = sha256_hash(input_data)
|
|
hash_binario = bin(int(hash_resultado, 16))[2:].zfill(256)
|
|
|
|
#script_sig_binario = binario_de_hexadecimal(hash_resultado[:128])
|
|
n_secuencia_binario = binario_de_hexadecimal(hash_resultado[:8])
|
|
|
|
# Crear diferentes "ventanas" para cada parte del proceso
|
|
altura, ancho = stdscr.getmaxyx()
|
|
|
|
# Ventana para el resultado
|
|
win_resultado = curses.newwin(altura // 3, ancho, 0, 0)
|
|
win_resultado.box()
|
|
win_resultado.addstr(1, 1, f"Hashing {ciclo}:", curses.color_pair(1)) # Posición de texto ajustada
|
|
win_resultado.addstr(2, 1, f"Hash SHA-256: {hash_resultado}", curses.color_pair(1))
|
|
win_resultado.addstr(3, 1, f"ScriptPubKey: {hash_resultado[:64]}", curses.color_pair(3))
|
|
win_resultado.addstr(4, 1, f"ScriptSig HEX: {hash_resultado[:32]}", curses.color_pair(3))
|
|
win_resultado.addstr(5, 1, f"nSeq BIN: {n_secuencia_binario}", curses.color_pair(4))
|
|
win_resultado.refresh()
|
|
|
|
# Ventana para el padding
|
|
win_padding = curses.newwin(altura // 3, ancho, altura // 3, 0)
|
|
win_padding.box()
|
|
win_padding.addstr(1, 1, "Padding:", curses.color_pair(1))
|
|
for i, linea in enumerate(mensaje_binario[j:j+64] for j in range(0, len(mensaje_binario), 64)):
|
|
win_padding.addstr(i + 2, 1, linea, curses.color_pair(4))
|
|
win_padding.refresh()
|
|
time.sleep(0.5)
|
|
win_padding.refresh()
|
|
|
|
# Ventana para el hash binario
|
|
win_hash_binario = curses.newwin(altura // 3, ancho, 2 * altura // 3, 0)
|
|
win_hash_binario.box()
|
|
win_hash_binario.addstr(1, 1, "BIN:", curses.color_pair(1))
|
|
for i, linea in enumerate(hash_binario[j:j+64] for j in range(0, len(hash_binario), 64)):
|
|
win_hash_binario.addstr(i + 2, 1, linea, curses.color_pair(5))
|
|
win_hash_binario.refresh()
|
|
time.sleep(1) # Esperar antes de continuar con el siguiente ciclo
|
|
|
|
# Preparar para el siguiente ciclo
|
|
input_data = hash_resultado
|
|
ciclo += 1
|
|
|
|
def ex():
|
|
# Ejecutar el proceso en un bucle de `curses`
|
|
curses.wrapper(mainSHA)
|