{"id":16319,"date":"2021-02-16T02:53:20","date_gmt":"2021-02-16T01:53:20","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=16319"},"modified":"2024-04-26T18:11:49","modified_gmt":"2024-04-26T16:11:49","slug":"kryptowaehrung-wir-erzeugen-uns-heute-mal-einen-privaten-bitcoin-key-mit-java-bevor-der-btc-kurs-auf-ueber-50000-dollar-springt","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=16319","title":{"rendered":"Kryptow\u00e4hrung: Wir erzeugen uns heute mal einen privaten Bitcoin Key mit Java bevor der BTC Kurs auf \u00fcber 50000 Dollar springt"},"content":{"rendered":"<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-16323\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/Gesund-Spritze-2-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><br \/>\nEs ist bei Bitcoin sehr wichtig das Konzept zu verstehen, das man <strong>keine<\/strong> Online Verbindung f\u00fcr das generieren einer Bitcoion Wallet Adresse ben\u00f6tigt.<br \/>\nDas geht komplett Offline. Und ohne separaten Server, eine Webseite oder einen besonderen Service. Es wird nur etwas Mathe ben\u00f6tigt. Mit Java sind nur ein paar Zeilen n\u00f6tig. <\/p>\n<p>1. privaten Key erzeugen, dazu brauchen wir nur einen <strong>guten<\/strong> Zufallsgenerator der uns 32 Byte erzeugen kann. K\u00f6nnte mal auch ausw\u00fcrfeln.<br \/>\n2. validieren ob der Key g\u00fcltig ist<\/p>\n<p>Hier der dokumentierte Code: &#8230;<!--more--><\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twhash;\r\n\r\nimport java.security.NoSuchAlgorithmException;\r\nimport java.security.SecureRandom;\r\nimport java.util.Arrays;\r\n\r\n\/**\r\n * Privaten Bitcoin Key erzeugen.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class CreatePrivatKey {\r\n\r\n\tpublic static void main(String[] args) throws NoSuchAlgorithmException {\r\n\r\n\t\tbyte[] privaterKey = new byte[PrivateKey.PRIVATE_KEY_GROESSE]; \/\/ immer geheim halten\r\n\t\tdo {\r\n\t\t\tSecureRandom secRandom = SecureRandom.getInstanceStrong();\r\n\t\t\tSystem.out.println(\"Verwende Algorithmus (je nach System)                        : \" + secRandom.getAlgorithm());\r\n\r\n\t\t\tsecRandom.nextBytes(privaterKey);\r\n\t\t} while (!PrivateKey.isBitcoinPrivateKeyGueltig(privaterKey));\r\n\r\n\t\tSystem.out.println(\"Privater Key in String pr\u00e4senations Format                   : \" + Arrays.toString(privaterKey));\r\n\t\tSystem.out.println(\"Privater Key (32 Byte bei 8 Bit = 256 Bits = 64 Hex) erzeugen: \" + Transform.bytesToHex(privaterKey)); \/\/ 24e8621ad9cab81a1aa5793665b376a58cfcb15fab02b28fa76b281401b7440c\r\n\t}\r\n}<\/pre>\n<p>Das ist schon alles, wir haben einen eigenen <strong>Bitcoin private Key<\/strong> erzeugt! Hurra! Wenn jemand anderes den gleichen Key generieren will gibt es 2 hoch 256 M\u00f6glichkeiten. Eine astronomisch gro\u00dfe Zahl.<\/p>\n<p>Genau sind aber nicht alle privaten Keys in Bitcoin g\u00fcltig. Die Keys m\u00fcssen kleiner sein als Hex:<\/p>\n<p><strong>0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140<\/strong><\/p>\n<p>weil Bitcoin Elliptic Curve Cryptography (ECC) nutzt (secp256k1). Das schr\u00e4nkt uns aber nicht wirklich ein. Ist der erzeugt Key zu gro\u00df, berechnen wir einfach einen neuen. Hier die Klasse die den Key validiert:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twhash;\r\n\r\nimport java.math.BigInteger;\r\n\r\n\/**\r\n * Checkt die G\u00fcltigkeit eines Bitcoin privat Keys.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class PrivateKey {\r\n\r\n\t\/**\r\n\t * Die L\u00e4nge des public Key in Bitcoin. 32-Byte.\r\n\t *\/\r\n\tpublic static final int PRIVATE_KEY_GROESSE = 32;\r\n\t\/**\r\n\t * Der max. m\u00f6gliche private Key Wert. Von 0x1\r\n\t * \r\n\t * bis\r\n\t * \r\n\t * 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036\r\n\t * 4140;\r\n\t * \r\n\t * Siehe https:\/\/en.bitcoin.it\/wiki\/Private_key und\r\n\t * https:\/\/en.bitcoin.it\/wiki\/Secp256k1\r\n\t *\/\r\n\tprivate static final String MAX_ECDSA_PRIVATE_KEY = \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140\";\r\n\r\n\t\/**\r\n\t * Checkt ob der private Key g\u00fcltig ist. D.h. ob er die maximal g\u00fcltige Gr\u00f6\u00dfe\r\n\t * nicht \u00fcbersteigt.\r\n\t * \r\n\t * @param privaterKey der zu \u00fcberpr\u00fcfende Key\r\n\t * @return wenn der Key g\u00fcltig ist wird true geliefert, wenn er ung\u00fcltig ist\r\n\t *         false.\r\n\t *\/\r\n\tpublic static boolean isBitcoinPrivateKeyGueltig(byte[] privaterKey) {\r\n\r\n\t\tif (privaterKey.length != 32) {\r\n\t\t\tthrow new IllegalArgumentException(\"Der private Key ist nicht 32-Byte lang\");\r\n\t\t}\r\n\r\n\t\tBigInteger maxBitcoinPrivateKeyWert = new BigInteger(MAX_ECDSA_PRIVATE_KEY, 16);\r\n\t\tBigInteger key = new BigInteger(Transform.bytesToHex(privaterKey), 16);\r\n\r\n\t\tSystem.out.println(\"Privater Key in Dezimal                                      : \" + key);\r\n\t\tSystem.out.println(\"Maximal m\u00f6glicher privater Key in Dezimal                    : \" + maxBitcoinPrivateKeyWert);\r\n\r\n\t\treturn key.compareTo(maxBitcoinPrivateKeyWert) &lt; 0 ? true : false;\r\n\t}\r\n}<\/pre>\n<p>Die Ausgabe des Programms liefert dann den <strong>private Key<\/strong> in der letzen Zeile als Hex:<\/p>\n<pre class=\"lang:default decode:true \" >Verwende Algorithmus (je nach System)                        : NativePRNGBlocking\r\nPrivater Key in Dezimal                                      : 93750168568141633471316910723068691361065235165031563689710894762687964706633\r\nMaximal m\u00f6glicher privater Key in Dezimal                    : 115792089237316195423570985008687907852837564279074904382605163141518161494336\r\nPrivater Key in String pr\u00e4senations Format                   : [-49, 68, -73, 10, -49, 48, -106, 20, 106, -41, -54, -100, 17, -89, -91, 23, -124, -78, -91, 18, 87, 0, 14, -49, -103, 12, -89, 109, 101, 96, -9, 73]\r\nPrivater Key (32 Byte bei 8 Bit = 256 Bits = 64 Hex) erzeugen: cf44b70acf3096146ad7ca9c11a7a51784b2a51257000ecf990ca76d6560f749\r\n<\/pre>\n<p>Nun haben wir schon einen <strong>g\u00fcltigen<\/strong> privaten Key f\u00fcr Bitcoin erzeugt. Wer den privaten Key cf44b70acf3096146ad7ca9c11a7a51784b2a51257000ecf990ca76d6560f749 dann mal validieren will, kann ihn ja mal <a href=\"https:\/\/gobittest.appspot.com\/Address\" rel=\"noopener\" target=\"_blank\">hier im Feld 0 &#8211; Private ECDSA Key<\/a> eingeben und auf &#8222;Send&#8220; klicken. Schon wird online die g\u00fcltige Bitcoin-Adresse 1JqbJP3N2jvmbz3nQzzPYjeXtWbcCTMHUD bzw. Konto generiert. <\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/wenzlaff.de-2021-02-15-um-18.08.39.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2021\/02\/wenzlaff.de-2021-02-15-um-18.08.39.png\" alt=\"\" width=\"2004\" height=\"1996\" class=\"aligncenter size-full wp-image-16320\" \/><\/a><\/p>\n<p>Der private Key muss ja <strong>immer geheim<\/strong> gehalten werden. Deshalb bitte nichts auf diese nun allgemein bekannte Adresse \u00fcberweisen \ud83d\ude09 Aber es gibt ja auch noch gen\u00fcgend andere Adressen \ud83d\ude09<\/p>\n<p>Nun kommt der eigentlich viel spannenderer Task, aus dem privaten Key den public Key mit Java zu generieren. Das geht mit der Elliptic Curve Cryptography (ECC) (secp256k1). Auf der obigen Online-Seite habe wir das ja schon gemacht. Aber eben nicht offline und mit Java. Dann mal los, aber nicht mehr heute &#8230; <\/p>\n<p><strong>Kleine Programmier challenge<\/strong>: Wer will, kann mir den Java Code per E-Mail senden, wie am besten aus dem privaten Key ein public Key erzeugt wird. Auf wunsch nenne ich dann auch den Namen und stelle die verschiedenen M\u00f6glichkeiten vor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es ist bei Bitcoin sehr wichtig das Konzept zu verstehen, das man keine Online Verbindung f\u00fcr das generieren einer Bitcoion Wallet Adresse ben\u00f6tigt. Das geht komplett Offline. Und ohne separaten Server, eine Webseite oder einen besonderen Service. Es wird nur etwas Mathe ben\u00f6tigt. Mit Java sind nur ein paar Zeilen n\u00f6tig. 1. privaten Key erzeugen, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=16319\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eKryptow\u00e4hrung: Wir erzeugen uns heute mal einen privaten Bitcoin Key mit Java bevor der BTC Kurs auf \u00fcber 50000 Dollar springt\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4,3897,5,79,1319],"tags":[4631,1183,4632,4633],"class_list":["post-16319","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-eclipse","category-java-programmierung","category-java","category-programmierung","category-sicherheit-2","tag-4631","tag-bitcoin","tag-private-key","tag-privater-bitcoin-key"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16319"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16319\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16319"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}