Open Source JavaScript Client-Side Bitcoin Wallet Generator
-
+
-
Single Wallet
Paper Wallet
Bulk Wallet
@@ -4080,57 +4081,18 @@
Wallet Details
-
-
-
-
-
- Hide Art?
- Addresses per page:
- Addresses to generate:
-
-
-
-
- Start index:
- Rows to generate:
-
-
-
-
-
-
- Enter Passphrase:
-
- Show?
-
-
-
- Confirm Passphrase:
-
-
- Algorithm: SHA256(passphrase)
-
-
-
-
- Step 1 - Generate your "Step1 Key Pair"
-
-
-
- Enter Private Key (any format)
-
-
-
+
+ Generating Bitcoin Address...
+ MOVE your mouse around to add some extra randomness...
+ MOVE your mouse around to add some extra randomness...
-
-
- Generating Bitcoin Address...
- MOVE your mouse around to add some extra randomness...
+
- MOVE your mouse around to add some extra randomness...
+
+
-
-
-
+
+
+
+
@@ -4150,151 +4112,51 @@
- Comma Separated Values: Index,Address,Private Key (WIF)
-
+
+
-
+ Hide Art?
+ Addresses per page:
+ Addresses to generate:
+
+
+
+
-
-
-
-
- Bitcoin Address:
-
+
+
" + pubKeySecondHalf; - document.getElementById("detailpubkeycomp").innerHTML = pubKeyComp; - document.getElementById("detailaddress").innerHTML = btcKey.getBitcoinAddress(); - document.getElementById("detailaddresscomp").innerHTML = btcKey.getBitcoinAddressCompressed(); - document.getElementById("detailprivwif").innerHTML = btcKey.getBitcoinWalletImportFormat(); - document.getElementById("detailprivwifcomp").innerHTML = btcKey.getBitcoinWalletImportFormatCompressed(); - document.getElementById("detailprivhex").innerHTML = btcKey.toString().toUpperCase(); - document.getElementById("detailprivb64").innerHTML = btcKey.toString("base64"); - ninja.qrCode.showQrCode({ - "detailqrcodepublic": btcKey.getBitcoinAddress(), - "detailqrcodepubliccomp": btcKey.getBitcoinAddressCompressed(), - "detailqrcodeprivate": btcKey.getBitcoinWalletImportFormat(), - "detailqrcodeprivatecomp": btcKey.getBitcoinWalletImportFormatCompressed() - }); - } - }, - - clear: function () { - document.getElementById("detailpubkey").innerHTML = ""; - document.getElementById("detailpubkeycomp").innerHTML = ""; - document.getElementById("detailaddress").innerHTML = ""; - document.getElementById("detailaddresscomp").innerHTML = ""; - document.getElementById("detailprivwif").innerHTML = ""; - document.getElementById("detailprivwifcomp").innerHTML = ""; - document.getElementById("detailprivhex").innerHTML = ""; - document.getElementById("detailprivb64").innerHTML = ""; - document.getElementById("detailprivmini").innerHTML = ""; - document.getElementById("detailqrcodepublic").innerHTML = ""; - document.getElementById("detailqrcodepubliccomp").innerHTML = ""; - document.getElementById("detailqrcodeprivate").innerHTML = ""; - document.getElementById("detailqrcodeprivatecomp").innerHTML = ""; - } + + + + + + + + + + + \ No newline at end of file
+ Start index:
+ Rows to generate:
+
+
+
+
+ Comma Separated Values: Index,Address,Private Key (WIF)
+
+
+
+
-
-
+
-
+ Why should I use a Bulk Wallet to accept Bitcoins on my website?
+
+
+
+ The traditional approach to accepting bitcoins on your website requires that
+ you install the official bitcoin client daemon ("bitcoind"). Many website hosting packages
+ don't support installing the bitcoin daemon. Also, running the bitcoin daemon on your
+ web server means your private keys are hosted on the server and could get stolen if your web
+ server is hacked. When using a Bulk Wallet you can upload only the bitcoin addresses
+ and not the private keys to your web server. Then you don't have to worry about your
+ bitcoin wallet being stolen if your web server is hacked.
-
-
-
-
- Private Key (Wallet Import Format):
-
+
-
+
-
+ How do I use a Bulk Wallet to accept Bitcoins on my website?
+
-
-
-
-
-
-
- Step 1 Public Key:
-
-
Copy and paste the above into the Your-Part-Public-Key field in the Vanity Pool Website.
-
- Copy and paste the above into the Your-Part-Public-Key field in the Vanity Pool Website.
- Step 1 Private Key:
-
-
Copy and paste the above Private Key field into a text file. Ideally save to an encrypted drive. - You will need this to retrieve the Bitcoin Private Key once the Pool has found your prefix.
-
- Copy and paste the above Private Key field into a text file. Ideally save to an encrypted drive. - You will need this to retrieve the Bitcoin Private Key once the Pool has found your prefix.
- Step 2 - Calculate your Vanity Wallet
-
-
-
-
- Enter Your Part Private Key (generated in Step 1 above and previously saved):
-
- Enter Pool Part Private Key (from Vanity Pool):
-
-
-
-
-
- Vanity Private Key (WIF):
-
-
The above is the Private Key to load into your wallet.
-
- The above is the Private Key to load into your wallet.
- Vanity Bitcoin Address:
-
-
The above is your new address that should include your required prefix.
-
- The above is your new address that should include your required prefix.
-
-
-
-
-
-
-
- Your Bitcoin Private Key is a unique secret number that only you know. It can be encoded in a number of different formats.
- Below we show the Bitcoin Address and Public Key that corresponds to your Private Key as well as your Private Key in the most popular encoding formats (WIF, HEX, B64, MINI).
-
- Bitcoin v0.6+ stores public keys in compressed format. The client now also supports import and export of private keys with importprivkey/dumpprivkey. The format of the exported - private key is determined by whether the address was generated in an old or new wallet. -
- - Bitcoin v0.6+ stores public keys in compressed format. The client now also supports import and export of private keys with importprivkey/dumpprivkey. The format of the exported - private key is determined by whether the address was generated in an old or new wallet. -
-
- Bitcoin Address:
-
-
- -
-
- Bitcoin Address (compressed):
-
-
- -
- Public Key (130 characters [0-9A-F]):
-
-
-
- Public Key (compressed, 66 characters [0-9A-F]):
-
-
- -
-
- Private Key WIF (51 characters base58, starts with a '5'):
-
-
- -
-
- Private Key WIF (compressed, 52 characters base58, starts with a 'K' or 'L'):
-
-
- -
- Private Key Hexadecimal Format (64 characters [0-9A-F]):
-
-
-
- Private Key Base64 (44 characters):
-
-
-
- Private Key Mini Format (22, 26 or 30 characters, starts with an 'S'):
-
-
-
-
-
+
+
-
-
- Why should I use a Bulk Wallet to accept Bitcoins on my website?
-
-
-
- The traditional approach to accepting bitcoins on your website requires that
- you install the official bitcoin client daemon ("bitcoind"). Many website hosting packages
- don't support installing the bitcoin daemon. Also, running the bitcoin daemon on your
- web server means your private keys are hosted on the server and could get stolen if your web
- server is hacked. When using a Bulk Wallet you can upload only the bitcoin addresses
- and not the private keys to your web server. Then you don't have to worry about your
- bitcoin wallet being stolen if your web server is hacked.
-
-
-
+
- How do I use a Bulk Wallet to accept Bitcoins on my website?
-
-
-
-
+ -
+
- Use the Bulk Wallet tab to pre-generate a large number of bitcoin addresses (10,000+). Copy and paste the generated comma separated values (CSV) list to a secure text file on your computer. Backup the file you just created to a secure location.
- Import the bitcoin addresses into a database table on your web server. @@ -4314,7 +4176,162 @@ You should see the transaction there within 30 seconds.
- Bitcoins will safely pile up on the block chain. Use the original wallet file you generated in step 1 to spend them. -
+
+
+
+
+
+
+
+ Enter Passphrase:
+
+ Show?
+
+
+
+ Confirm Passphrase:
+
+
+ Algorithm: SHA256(passphrase)
+
+
+
+
+
+
+
+ Bitcoin Address:
+
+
+
+
+
+
+ Private Key (Wallet Import Format):
+
+
+
+
+
+
+ Step 1 - Generate your "Step1 Key Pair"
+
+
+
+
+
+ Step 1 Public Key:
+
+
Copy and paste the above into the Your-Part-Public-Key field in the Vanity Pool Website.
+
+ Copy and paste the above into the Your-Part-Public-Key field in the Vanity Pool Website.
+ Step 1 Private Key:
+
+
Copy and paste the above Private Key field into a text file. Ideally save to an encrypted drive. + You will need this to retrieve the Bitcoin Private Key once the Pool has found your prefix.
+
+ Copy and paste the above Private Key field into a text file. Ideally save to an encrypted drive. + You will need this to retrieve the Bitcoin Private Key once the Pool has found your prefix.
+ Step 2 - Calculate your Vanity Wallet
+
+
+
+
+ Enter Your Part Private Key (generated in Step 1 above and previously saved):
+
[NOTE: this input box can accept a public key or private key] +
+
+ [NOTE: this input box can accept a public key or private key] +
Enter Pool Part Private Key (from Vanity Pool):
+
[NOTE: this input box can accept a public key or private key] +
+
+ [NOTE: this input box can accept a public key or private key] +
+
+
+
+
+
+
+
+ Vanity Bitcoin Address:
+
+
The above is your new address that should include your required prefix.
+
+
+ The above is your new address that should include your required prefix.
+ Vanity Public Key (HEX):
+
+
The above is the Public Key in hexadecimal format.
+
+
+ The above is the Public Key in hexadecimal format.
+ Vanity Private Key (WIF):
+
+
The above is the Private Key to load into your wallet.
+
+ The above is the Private Key to load into your wallet.
+
@@ -4329,7 +4346,7 @@
+ Enter Private Key (any format)
+
+
+
+
+
+
+
+
+
+
+ Your Bitcoin Private Key is a unique secret number that only you know. It can be encoded in a number of different formats.
+ Below we show the Bitcoin Address and Public Key that corresponds to your Private Key as well as your Private Key in the most popular encoding formats (WIF, HEX, B64, MINI).
+
+ Bitcoin v0.6+ stores public keys in compressed format. The client now also supports import and export of private keys with importprivkey/dumpprivkey. The format of the exported + private key is determined by whether the address was generated in an old or new wallet. +
+ + Bitcoin v0.6+ stores public keys in compressed format. The client now also supports import and export of private keys with importprivkey/dumpprivkey. The format of the exported + private key is determined by whether the address was generated in an old or new wallet. +
+
+ Bitcoin Address:
+
+
+ +
+
+ Bitcoin Address (compressed):
+
+
+ +
+ Public Key (130 characters [0-9A-F]):
+
+
+
+ Public Key (compressed, 66 characters [0-9A-F]):
+
+
+ +
+
+ Private Key WIF (51 characters base58, starts with a '5'):
+
+
+ +
+
+ Private Key WIF (compressed, 52 characters base58, starts with a 'K' or 'L'):
+
+
+ +
+ Private Key Hexadecimal Format (64 characters [0-9A-F]):
+
+
+
+ Private Key Base64 (44 characters):
+
+
+
+ Private Key Mini Format (22, 26 or 30 characters, starts with an 'S'):
+
@@ -4341,100 +4358,120 @@
+
+
+
+
+
+
- brainwallet: {
- open: function () {
- document.getElementById("brainarea").style.display = "block";
- document.getElementById("braincommands").style.display = "block";
- document.getElementById("brainpassphrase").focus();
- },
-
- close: function () {
- document.getElementById("brainarea").style.display = "none";
- document.getElementById("braincommands").style.display = "none";
- },
-
- minPassphraseLength: 15,
-
- view: function () {
- var key = document.getElementById("brainpassphrase").value.toString().replace(/^\s+|\s+$/g, ""); // trim white space
- document.getElementById("brainpassphrase").value = key;
- var keyConfirm = document.getElementById("brainpassphraseconfirm").value.toString().replace(/^\s+|\s+$/g, ""); // trim white space
- document.getElementById("brainpassphraseconfirm").value = keyConfirm;
-
- if (key == keyConfirm || document.getElementById("brainpassphraseshow").checked) {
- // enforce a minimum passphrase length
- if (key.length >= ninja.wallets.brainwallet.minPassphraseLength) {
- var bytes = Crypto.SHA256(key, { asBytes: true });
- var btcKey = new Bitcoin.ECKey(bytes);
- var bitcoinAddress = btcKey.getBitcoinAddress();
- var privWif = btcKey.getBitcoinWalletImportFormat();
- document.getElementById("brainbtcaddress").innerHTML = bitcoinAddress;
- document.getElementById("brainbtcprivwif").innerHTML = privWif;
- ninja.qrCode.showQrCode({
- "brainqrcodepublic": bitcoinAddress,
- "brainqrcodeprivate": privWif
- });
- document.getElementById("brainkeyarea").style.display = "block";
- }
- else {
- alert("The passphrase you entered is too short.\n\n"
- + "Warning: Choosing a strong passphrase is important to avoid brute force attempts to guess your passphrase and steal your bitcoins.");
- ninja.wallets.brainwallet.clear();
- }
- }
- else {
- alert("The passphrase does not match the confirm passphrase.");
- ninja.wallets.brainwallet.clear();
- }
- },
-
- clear: function () {
- document.getElementById("brainkeyarea").style.display = "none";
- },
-
- showToggle: function (element) {
- if (element.checked) {
- document.getElementById("brainpassphrase").setAttribute("type", "text");
- document.getElementById("brainpassphraseconfirm").style.visibility = "hidden";
- document.getElementById("brainlabelconfirm").style.visibility = "hidden";
- }
- else {
- document.getElementById("brainpassphrase").setAttribute("type", "password");
- document.getElementById("brainpassphraseconfirm").style.visibility = "visible";
- document.getElementById("brainlabelconfirm").style.visibility = "visible";
- }
- }
- },
-
- vanitywallet: {
- open: function () {
- document.getElementById("vanityarea").style.display = "block";
- document.getElementById("vanitycommands").style.display = "block";
- },
-
- close: function () {
- document.getElementById("vanityarea").style.display = "none";
- document.getElementById("vanitycommands").style.display = "none";
- document.getElementById("vanitystep1area").style.display = "none";
- document.getElementById("vanitystep2area").style.display = "none";
- document.getElementById("vanitystep1icon").setAttribute("class", "more");
- document.getElementById("vanitystep2icon").setAttribute("class", "more");
- },
-
- generateKeyPair: function () {
- var key = new Bitcoin.ECKey(false);
- var publicKey = Crypto.util.bytesToHex(key.getPub()).toString().toUpperCase();
- var privateKey = Crypto.util.bytesToHex(key.getBitcoinPrivateKeyByteArray()).toString().toUpperCase();
-
- document.getElementById("vanitypubkey").innerHTML = publicKey;
- document.getElementById("vanityprivatekey").innerHTML = privateKey;
- document.getElementById("vanityarea").style.display = "block";
- document.getElementById("vanitystep1area").style.display = "none";
- },
-
- addKeys: function () {
- var privateKeyWif = false;
- var bitcoinAddress = false;
- try {
- var privateKeyString = document.getElementById("vanityprivkey").value;
- var privatePoolKeyString = document.getElementById("vanitypoolprivkey").value;
-
- var privateKey = BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(privateKeyString));
- if (ninja.privateKeyFormat.isHexFormat(privatePoolKeyString)) {
- var privatePoolKey = BigInteger.fromByteArrayUnsigned(Crypto.util.hexToBytes(privatePoolKeyString));
- }
- else if (ninja.privateKeyFormat.isCompSipaWalletImportFormat(privatePoolKeyString)) {
- var bytes = Bitcoin.Base58.decode(privatePoolKeyString);
- bytes.shift();
- bytes.pop();
- bytes = bytes.slice(0, bytes.length - 4);
- if (bytes.length == 32) {
- var privatePoolKey = BigInteger.fromByteArrayUnsigned(bytes);
- }
- }
- else if (ninja.privateKeyFormat.isSipaWalletImportFormat(privatePoolKeyString)) {
- var bytes = Bitcoin.Base58.decode(privatePoolKeyString);
- bytes.shift();
- bytes = bytes.slice(0, bytes.length - 4);
- if (bytes.length == 32) {
- var privatePoolKey = BigInteger.fromByteArrayUnsigned(bytes);
- }
- }
-
- if (privatePoolKey != undefined) {
- var n = EllipticCurve.getSECCurveByName("secp256k1").getN();
- var newPrivateKey = new Bitcoin.ECKey(privateKey.add(privatePoolKey).mod(n));
- bitcoinAddress = newPrivateKey.getBitcoinAddress();
- privateKeyWif = newPrivateKey.getBitcoinWalletImportFormat();
- }
-
- } catch (e) {
- alert(e);
- }
- document.getElementById("vanityprivatekeywif").innerHTML = privateKeyWif;
- document.getElementById("vanityaddress").innerHTML = bitcoinAddress;
- document.getElementById("vanitystep2area").style.display = "block";
- document.getElementById("vanitystep2icon").setAttribute("class", "less");
- },
-
- openCloseStep: function (num) {
- // do close
- if (document.getElementById("vanitystep" + num + "area").style.display == "block") {
- document.getElementById("vanitystep" + num + "area").style.display = "none";
- document.getElementById("vanitystep" + num + "icon").setAttribute("class", "more");
- }
- // do open
- else {
- document.getElementById("vanitystep" + num + "area").style.display = "block";
- document.getElementById("vanitystep" + num + "icon").setAttribute("class", "less");
- }
- }
- },
-
- detailwallet: {
- open: function () {
- document.getElementById("detailarea").style.display = "block";
- document.getElementById("detailcommands").style.display = "block";
- document.getElementById("detailprivkey").focus();
- },
-
- close: function () {
- document.getElementById("detailarea").style.display = "none";
- document.getElementById("detailcommands").style.display = "none";
- },
-
- viewDetails: function () {
- var key = document.getElementById("detailprivkey").value.toString().replace(/^\s+|\s+$/g, ""); // trim white space
- document.getElementById("detailprivkey").value = key;
- var keyFormat = ninja.privateKeyFormat;
- // hide Private Key Mini Format
- document.getElementById("detailmini").style.display = "none";
-
- if (keyFormat.isSipaWalletImportFormat(key)) {
- var bytes = Bitcoin.Base58.decode(key);
- bytes.shift();
- bytes = bytes.slice(0, bytes.length - 4);
- if (bytes.length != 32) {
- alert("The text you entered is not a valid Private Key");
- ninja.wallets.detailwallet.clear();
- }
- else {
- var btcKey = new Bitcoin.ECKey(bytes);
- }
- }
- else if (keyFormat.isCompSipaWalletImportFormat(key)) {
- var bytes = Bitcoin.Base58.decode(key);
- bytes.shift();
- bytes.pop();
- bytes = bytes.slice(0, bytes.length - 4);
- if (bytes.length != 32) {
- alert("The text you entered is not a valid Private Key");
- ninja.wallets.detailwallet.clear();
- }
- else {
- var btcKey = new Bitcoin.ECKey(bytes);
- }
- }
- else if (keyFormat.isHexFormat(key)) {
- var bytes = Crypto.util.hexToBytes(key);
- var btcKey = new Bitcoin.ECKey(bytes);
- }
- else if (keyFormat.isBase64Format(key)) {
- var bytes = Crypto.util.base64ToBytes(key);
- if (bytes.length != 32) {
- alert("The text you entered is not a valid Private Key");
- ninja.wallets.detailwallet.clear();
- }
- else {
- var btcKey = new Bitcoin.ECKey(bytes);
- }
- }
- else if (keyFormat.isMiniFormat(key)) {
- var bytes = Crypto.SHA256(key, { asBytes: true });
- var btcKey = new Bitcoin.ECKey(bytes);
- document.getElementById("detailprivmini").innerHTML = key;
- document.getElementById("detailmini").style.display = "block";
- }
- else {
- // enforce a minimum passphrase length
- if (key.length >= ninja.wallets.brainwallet.minPassphraseLength) {
- // Deterministic Wallet confirm box to ask if user wants to SHA256 the input to get a private key
- var usePassphrase = confirm("The text you entered is not a valid Private Key!\n\n"
- + "Would you like to use the entered text as a passphrase and create a Private Key using a SHA256 hash of the passphrase?\n\n"
- + "Warning: Choosing a strong passphrase is important to avoid brute force attempts to guess your passphrase and steal your bitcoins.");
- if (usePassphrase) {
- var bytes = Crypto.SHA256(key, { asBytes: true });
- var btcKey = new Bitcoin.ECKey(bytes);
- }
- else {
- ninja.wallets.detailwallet.clear();
- }
- }
- else {
- alert("The text you entered is not a valid Private Key");
- ninja.wallets.detailwallet.clear();
- }
- }
-
- if (btcKey != undefined) {
- var pubKey = Crypto.util.bytesToHex(btcKey.getPub()).toUpperCase();
- var pubKeyComp = Crypto.util.bytesToHex(btcKey.getPubCompressed()).toUpperCase();
- var halfWayIndex = Math.floor(pubKey.length / 2);
- var pubKeyFirstHalf = pubKey.substr(0, halfWayIndex);
- var pubKeySecondHalf = pubKey.substr(halfWayIndex, pubKey.length - halfWayIndex);
- document.getElementById("detailpubkey").innerHTML = pubKeyFirstHalf + "" + pubKeySecondHalf; - document.getElementById("detailpubkeycomp").innerHTML = pubKeyComp; - document.getElementById("detailaddress").innerHTML = btcKey.getBitcoinAddress(); - document.getElementById("detailaddresscomp").innerHTML = btcKey.getBitcoinAddressCompressed(); - document.getElementById("detailprivwif").innerHTML = btcKey.getBitcoinWalletImportFormat(); - document.getElementById("detailprivwifcomp").innerHTML = btcKey.getBitcoinWalletImportFormatCompressed(); - document.getElementById("detailprivhex").innerHTML = btcKey.toString().toUpperCase(); - document.getElementById("detailprivb64").innerHTML = btcKey.toString("base64"); - ninja.qrCode.showQrCode({ - "detailqrcodepublic": btcKey.getBitcoinAddress(), - "detailqrcodepubliccomp": btcKey.getBitcoinAddressCompressed(), - "detailqrcodeprivate": btcKey.getBitcoinWalletImportFormat(), - "detailqrcodeprivatecomp": btcKey.getBitcoinWalletImportFormatCompressed() - }); - } - }, - - clear: function () { - document.getElementById("detailpubkey").innerHTML = ""; - document.getElementById("detailpubkeycomp").innerHTML = ""; - document.getElementById("detailaddress").innerHTML = ""; - document.getElementById("detailaddresscomp").innerHTML = ""; - document.getElementById("detailprivwif").innerHTML = ""; - document.getElementById("detailprivwifcomp").innerHTML = ""; - document.getElementById("detailprivhex").innerHTML = ""; - document.getElementById("detailprivb64").innerHTML = ""; - document.getElementById("detailprivmini").innerHTML = ""; - document.getElementById("detailqrcodepublic").innerHTML = ""; - document.getElementById("detailqrcodepubliccomp").innerHTML = ""; - document.getElementById("detailqrcodeprivate").innerHTML = ""; - document.getElementById("detailqrcodeprivatecomp").innerHTML = ""; - } + + + + + + + + + + + \ No newline at end of file