News
Theorie
- Asymmetrische Kryptographie: https://de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
- Public-Key Verschlüsselung: https://de.wikipedia.org/wiki/Public-Key-Verschl%C3%BCsselungsverfahren
- RSA-Verschlüsselung: https://de.wikipedia.org/wiki/RSA-Kryptosystem
- Blockchain: https://de.wikipedia.org/wiki/Blockchain
BadBlockChain
Format eines BadBlocks
5 # Nummer des Blocks 98 # Hash vom Vorgängerblock 1 # Anzahl Transactions 1513199769622,7630423873,8565935687,40,2478293393 8565935687,3747393 # Öffentlicher Schlüssel vom Miner, Nonce so, dass Hash(block) < difficulty (2^10).
Transaction
1513199769622,7630423873,8565935687,40,2478293393
Timestamp (ms seit 1.1.1970), Public Key vom Sender, Public Key vom Empfänger, Betrag der überwiesen wird, Digitale Unterschrift vom Sender
Unterschrift
Man bildet den Hash $h$ der Transaction (ohne ',Unterschrift'). $h$ wird mit PrivateKey vom Sender verschlüsselt.
Verfizierung: Hash $h$ bilden, und Unterschrift mit PublicKey vom Sender entschlüsseln, beide Werte müssen gleich sein.
RSA
Sei n eine Zahl, der Modulus.
Rechnen mit Resten modulo n: Alle Resultate werden durch n geteilt und der Rest genommen.
$a^x \mod n = b$ kann nicht effizient nach $x$ aufgelöst werden, d.h. der diskrete Logarithmus ist nicht effizient berechenbar.
RSA: öffentlicher Modulus $m$, öffentlicher Exponent $e$, privater Exponent $p$.
Clou: $\left(a^e\right)^p = a = \left(a^p\right)^e = a^{e\cdot p} \mod m$.
Anwendung BadBlockChain
Key Management
Key Erzeugen:
- makekey.py
from badkeymaterial import BadKeyMaterial print BadKeyMaterial(32)
Ausgabe z.B.
Public modulus: 4906493971 public exponent: 31 private exponent: 158269471
Key verwenden:
- initkey.py
from badkeymaterial import BadKeyMaterial # modulus eintragen k=BadKeyMaterial(4906493971) # privaten Schlüssel setzen k.private = 158269471
Mining:
- miner.py
from badblockchain import BadBlockChain from badkeymaterial import BadKeyMaterial c = BadBlockChain() c.getNewBlocks() # Blockchain import # modulus eintragen k=BadKeyMaterial(4906493971) # privaten Schlüssel setzen k.private = 158269471 c.mine(k.modulus) print c.wallets.wallets
Neue Hash-Funktion:
# 32-Bit Hash @classmethod def badHash(cls,x): x = str(x) h = 0xdeadbeef for i in xrange(0,len(x)): h = ((h+6543)*(ord(x[i])+57361)+567) % 2**32 return h