Skip to content

Instantly share code, notes, and snippets.

@oscarguindzberg
Last active November 17, 2022 11:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oscarguindzberg/65477cdd156de47eb20c9685a79194eb to your computer and use it in GitHub Desktop.
Save oscarguindzberg/65477cdd156de47eb20c9685a79194eb to your computer and use it in GitHub Desktop.
Find out priv key used on the bitfinex attack
import org.bitcoinj.core.Context;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.script.Script;
import org.spongycastle.util.encoders.Hex;
/**
* Created by oscar on 02/08/2016.
*/
public class BitfinexResearch {
public static void main(String[] args) {
new Context(MainNetParams.get());
tx248();
tx20();
}
private static void tx248() {
String hex0 = "01000000012e7d3007a735d01cce0e99485d4eb0ee249457c711c6d9a1ed88c2d0cb3f018f01000000fc00473044022045aba3c6b46f598ffea3076738c5d765910b4bea6072dcd6d313872a669b2a5a02201945b38eb0acc94375adb087f3abc114a5442d8ab961487919dff7034d3e177c0147304402207f5d70442f7d5926783b31d6d99d5bee15af7a2d785f892942ffd2283536cd4a022013ed2f096f9491592f857aff6ad69571e34473a302db6380b8116e3bd4b8075e014c69522102c04eccfa1d891b2ee65884e624d044b3fae808acb5f9a8733f26ff34310eab1821037ef19ded5fa136d942544406ec3206af908ae167a95dc95ede6830d1dec9ec752103d6580232e65671d4e4c4aa76098963a3d18fafc1d96732a5bfd76eae8569c42453aeffffffff024de543000000000017a914abfeccd572cda3e1f0adfbb17e6a568296569e2a879e3e08010000000017a914c2aeb33b1a23ddd81f31a419f0d76006e7505eb68700000000";
Transaction tx0 = new Transaction(MainNetParams.get(), Hex.decode(hex0));
String hex = "010000000a0c5ab284ba44840f246f046e0f62218f0e8609f35d176332d2c54bf1e8755f0201000000fdfe0000483045022100ae4e9c63efe532a0f92233ced646910eabc9a7b03c008db8743c0159cf180f3b02207c092ac6e376733765792d54b11ed02063f2e1c62b0d4b7a69c91af8c710f7a501483045022100af0cbfbaa13fb453dd32702a75ffd6d6e2c7e4d6d6b9ebc3304bba6265a4e18802205a4309b5ab905d6228d405454f326dc702919aa3d576d249f84c621f2496afe1014c695221037833c5c5d9e34bbe909fd7186c6660a28ab34b9159b3cf0e409dfdb60c0154e021028e799766bff959eecc2674cd79b0d442c55eb5eb97ed4c47ca6e5c4cea9656012102eb54b05382141970b2cfcaec28e378543478328387840e2549951929a159b77653aeffffffff903fbb1f66de16baa8b110ee3391207bfb494d950024b115adc1ee05f58c15e301000000fc00473044022055955fa60807ad6e52d393ddf819646552aa9a80d912501c5523cb911418eb2d02202277987327507569cb4b7db64d5927b3f141aa6d914c800faa10ad2da91934c301473044022078c22537e7d856b3b4c0c02eae16eee67728eee082171409aab5ff71cea1b00e022042f934662bb13402091a0e366a9da03515b9c8ae5da4f16c3dc7e5818e15220a014c6952210234651fe4a3405f2f02681fcfda658914a52473c9056011d24273002229afef00210257fcb91dae81cd24e26647182566cf3805417b5cb74e2dc796ee257588b6d5f92102a6bee9786748d83bafb282e64b21c12e1b4b3deba51039e00c9b5a9c5fa7afb953aeffffffffa7f8703c3a0bc88d122981a940d38d2018d493bce701c0836045174a899bab9201000000fdfe000048304502210093937b7a6da5b3d39327f204a47d99e4a234838a84828ca4f540c05f635940f0022054b84428ae950a3d111cec518e6fc2d1cc317e0287b6ae320db2acc9c005c68e01483045022100ddfb100be92b949600cfaf4e64bb8f389e4576e7823bbb1f823ddf88ce8bf79102203eaf3f154f663339998276b6fca2d0399825df5af7f58b302d4cc8fd18da81bb014c69522102f701258366cab85487d6de473048dc5e9a3f3c55936280d3a1fe0aa6dae0ba7f2102f48ed5937e1da7ed43b46b3f82a7a55d9f7dcd2d8800f26be72eb1d14a123ec421033636ce3b8bfd93da47228fdc14394256d986df52fdceca232d1d3743bf3cd62053aeffffffffb304c286705e9b06902811ebca20a696dad58d7d23b5b17aaa318d15e383f3c500000000fdfe0000483045022100d67ad6af0c77c06bb7838d9bf91017bd54955b1570db742c76de0fb75801a07d022058843a5cc7417cf54a5bc2632569100fa7a39c5b3f7bb46f519483b8abb34b9b0148304502210089223a1207d1ef4207feff5108fb40a6d69c32a90c388c5cf1b5fadabb900cf30220745e2d6f3ee45787c2bcf379f481bf04f47fa8008fa8eb3869692dbbbbba46b8014c695221028c0db008b8624020b2775551e06e8c5e9b3552ee98020667ad3e82444723be1b21035ad27950edf4bd16145301aa81df916cce001481dfb1ff15d0984e57da9ba8e121035fa5b86d63bf1177c760b2431e60af773e839f0abda0e1ff766b60e5bb4cd99653aeffffffff85272a31bce3146be7623bd333098edc1d852deb8359a7602778748e326840ad01000000fdfd00004730440220602f88f03705a41339eac071f6e5b38ce431a26670021cfa4c90e28699af00cc0220343673bd13037b84b469d04546da65b3cc3a5fc1b1fb648414e636135032dfc901483045022100a0da0ed26444c72cba46c2302e31abdcb8d18801bfb365494d8ef476adf02f9c022005b960a44f168002d48b94763083864722fe5a198715f021cc5a753dec20b6ff014c695221032a8cdf7d161ae7592d10ff878089be047a14913d9f915290233dff8051ec495e2103d797d9b8c9939e31210cda61b7a9e7dfc5582d5a9c9967c4c12a3bb2bcf0c3832102dfb80ed17852217d9ae81a0428e02cf6ba613eecca93db02dfc1736875c3c75753aeffffffff5f236051c2512ae7a51e43118990c6b20f8bbc1b3abb177d748f0f1db765c92a00000000fc00463043021f4474c244712af145dcf701a631912cfa5c8673e39fc38266d0dc5b94b84990022011662037afef602f5a24b8a1cb163617a35e485e3f86b8a7b77a63b6bf631caa01483045022100c08f04f5e7895aaf29246828d6340557f4ebe990025f75b712c34c5a957e888f02206603fa6d60f0b2f9070f8570afbb2dbe4c2f464076467ea1d599da7e18bec083014c69522102d1d4695d65e095b7d4d19ba7e4ebd01b1be594345af005f8c8d72d1f546acccc21025de084bf9782c0779712fdbe36acc9e0ad5e98a961be114efcbfbd4a45ece743210317a840b98db1cd1bf63e78ee0cdfffb9f8847b2b1c053211ff1f5fd5d6aaa57853aeffffffff38d743beb1c1182ca073d886e5d792c7660365dd44a876aaa0a030569605761500000000fdfd0000483045022100a103dea63d3e973d3077923cc46f2ff228512fca3d40b9789d6fccaf824fbb850220198d256a8e08c64049b13f44b752e161f47f1850e7ef369f9e73506f5075f52e014730440220714ca45aaa4fa3df115e69fdc4e6e45e95cfbcd2a5ae0e4d63493685f298a7a9022022cf1ff796dae235cb9fa3b0fdf64caee8baa7813898ca63db86e440d1ead252014c695221025985be64de6701435d62b2a203a5ef91a6c1fab22924646e494084c384a3e01e21030ea42f7def494ddf1c0e660b1d2efcfbc89046bd16827192f16a1a7aef2931fa2102b08cc9fef0d070abeb03e4295dd9c6d9dd6d624cb8c2be063bed0e922250178053aeffffffff2f06b2aa909d698270afc538b7b7749cb5922c5f752276565da48808898d119b01000000fdfe0000483045022100f9a70af9b2f1a0b3909df83f2f1539cfda7004970d825e5d2a8711ad38bc78a202205bef9230d98a303cb0ab087cb15b0e603e06191910733a1a31565486f14e9ba801483045022100f2239edea43b806ecadf8e6f561ce8a9930a96a39657c618a35014c9f44f09890220695f13e1b3c5676d9916e1374151441e8f51f5a5e7a2b2b821bccbe1ff91990e014c69522102f701258366cab85487d6de473048dc5e9a3f3c55936280d3a1fe0aa6dae0ba7f2102f48ed5937e1da7ed43b46b3f82a7a55d9f7dcd2d8800f26be72eb1d14a123ec421033636ce3b8bfd93da47228fdc14394256d986df52fdceca232d1d3743bf3cd62053aeffffffff2470795a9f7eff60c19a062f76e3f9302a88e937d20539f92f278b023c2697e500000000fdfd0000483045022100f5ed4429202efafdbf08684fbbfbce213219734ec6d9ff932356b0a3f222495702201890583dc01752c9b97b5f1e1220b041ed34a0c897eff4de9f72c28149778b91014730440220160dcf149b849baf18aaed6a63552382ca439f96bb5525e631f73974c39ce1200220688d02267a3683d96f83564f5165e34fc8c96352589b2c7a401b686c1fb2cd12014c6952210245487a9c3f01399363e2a3fe02f99c6b7bbf5da14fd0c30646d30f0ff65c57bd2102ec612d970f23ac2c03ba89cfa6a2a932836ca78082c0f84e3b012fd069f725452103bcdc8dbe6b5fa3bd5cc2b74df64056ab04e4b6615d8c6a87504f265ec6ea4b6f53aeffffffffd0fa1e1ae66d4b6c2d0ea9ce6d869100d3da06c0ece87119a3ffddcff66d19d901000000fdfd0000483045022100a7cca56820abab3a5064826ee091ac47d6c5763c680402d2315b5847510c0c2b0220202b5a44be788a7366147bde1d8b8c2b9e4e43c4fe297a8de0950c982b1cb34b0147304402203a92f6d404e5cff7fa5594c427f0efe8412513de2437311bed471aeffb1fe53c022020d145a7765ca7915b47d63bddad7969f25ade2affb3ca90f9bf87037d5c0497014c69522102f701258366cab85487d6de473048dc5e9a3f3c55936280d3a1fe0aa6dae0ba7f2102f48ed5937e1da7ed43b46b3f82a7a55d9f7dcd2d8800f26be72eb1d14a123ec421033636ce3b8bfd93da47228fdc14394256d986df52fdceca232d1d3743bf3cd62053aeffffffff0236b528cb050000001976a914d15972f804d5f8f78759714047e16f64ab43a8c788ace83b0d000000000017a914b8495a734a88a420b624dc1ae8fc80c90bfd5a498700000000";
Transaction tx = new Transaction(MainNetParams.get(), Hex.decode(hex));
Script scriptSig0 = tx.getInputs().get(0).getScriptSig();
Script scriptPub0 = tx0.getOutputs().get(1).getScriptPubKey();
// debug this line to find out which pub keys are being used
scriptSig0.correctlySpends(tx, 0, scriptPub0);
String hex1 = "010000000195d09cdd64c0e8262b77c21176cda5bc50ece62e9ab4cb2ffa0cdecaea9511a200000000fc0047304402202a8f48c77f5bda00c32a84f06533f0959986047e91b57777ab6296f9644334c202203777fd2e56d57fbfd706ca3d4e4fe9581dcfd8edc8788846fad28f98115c9012014730440220768e0f3b027f3eb72d66e3e37e10b0ff1e3eaad71aa1028d6217882d4c0f533a02202cd55b22465056285537fe8996963be4a9843bf5d5de0c1eda6533e3c970018e014c695221028a6ab4d62f058e7dd6b56ecaf50df82cd6687a65351040baed51b169cf31ded1210337964de2d8915bd71901d0b474d627c454ceb66da8b70e2332b825f343b554a12102c6d7f607c6326b80c76e19c600fa351bb45e856f31c3b7459a65d0eb4a2ba07053aeffffffff0295a909120000000017a91489742dfc2cfddb35bb357829bea95aeede013ccd87be2acc010000000017a914abfeccd572cda3e1f0adfbb17e6a568296569e2a8700000000";
Transaction tx1 = new Transaction(MainNetParams.get(), Hex.decode(hex1));
Script scriptSig1 = tx.getInputs().get(5).getScriptSig();
Script scriptPub1 = tx1.getOutputs().get(0).getScriptPubKey();
// debug this line to find out which pub keys are being used
scriptSig1.correctlySpends(tx, 5, scriptPub1);
}
private static void tx20() {
String hex0 = "0100000003efab361892796a53c4373c8e8ff9ad3344263c8dc1716169c685780b7d8af547010000006b483045022100ff7340acb7d49ca62de91358985bbdd8b3a0c86e7531e9c5995bc9138b2b311002207e5d431d25fa2c17af7bdf5c7639e5559733d37ccdd44d33a2ff52e67b1116ca012103635b5c3ecb248abea6ecc873ab87566934714fc375105287a0edecdd223f86a9ffffffffe45b4211fb68de9528de2917ed74abcef87f48746944472d55af232f574098f8010000006a4730440220061acea07fa6d4836cb07b7b65e6426835decb6bd3885bcf61720f1f095276d6022025d9ff5ec9bd73ee3b6c2018d41cd530bd2e742114566ceea9d0676c1942b141012102a9ed544754bd8b10d9e93ba856950361b94f09d43ad9bc92612b43a1df1d4504ffffffff087136e4b444606a9f0e758b4aa725993d3bc79967fb01fb534c95eb8c3aa365010000006a4730440220548785469713921f49056c06a62e854b9f0aa94bd521a9b06d8c16f7c43568b80220026c337a51917704aa34efd5caca5c52c7fa39ddf4392d6433f1fe2d4941187f0121027385d6369b33b629257d2806e56e16564b32ddba789501af91a55ee558a6e6c0ffffffff027d33245a0000000017a91400a2588c2275b63a93b02b91ce826c2a7a1b109587096f26bc000000001976a914fbb6da12dcca3759f9e23ced0d45298d5fd41c8288ac00000000";
Transaction tx0 = new Transaction(MainNetParams.get(), Hex.decode(hex0));
String hex = "0100000003bc29904657b6f068079cf0cb9e1b84f594d53918ce4bb559f22a27383aa6b23201000000fdfd0000483045022100985ba46d5ca79bc9704e63c31a2a121431b27c22c3795f4176f4412585d803c0022007ef66f2ed032d446abd0ddfea81676e3888fcb9b3ab759d3ea048fd4d5fb6660147304402207be263cdfa3c1351683fb4070a32d67e2f08e5fb1dac71c5a3ba770e24d635f002202241ed5c6a8993b6e4312d9de36065a599da3bbd0c062be6b67f93303a5559a8014c6952210308317e07c9d6be55e23f62c8c795a871623dbfa8172e38ffb80d3d1d9f4ab46a21033120890d0d60a41a9b53a865bc327d6d8a2663aaeeb0e8abc85133f76257d6502102a3347718c34ba184acbec2a9ca934cb33b5e9592cc39ee220ab8b5d51036a9a653aeffffffff603a14b8874b9364f200445adff02639358177036c473eaa5f965956f1b5879600000000fc004730440220228f04b4a20c1e41b83da12a4338bd578f7b91e1255faf1a5c6cfd1a0168840d02203eeeff2d24f04472431f48e738c76f0aee36ec65830726116e72a2831ee709420147304402207363c22b115851e27c587f133d0bef06fb7e3f6f36315a7c292e5e7521cbd889022000cfa11c0e39558e4cd306c56700cf8f71d079eb4085edf483c6aa71ede74386014c6952210344e6dcfc4c782d184c0290e7ef3ae5bcc6ada07a854c177485c2aeae2e7ce99821024b8214c285235c50a915fbab60f396d1be521ee20c52bd4834c98f6cb5b46db22102528e6bc3b8977f01fb2e8a1068e37782e2c85761b8598dcd908e10e2d191cfbe53aeffffffff782b827f408eafc6bca32589b1039e3ebdeb0db6ccdbc5fd30f2d7382073b4c701000000fdfd000047304402206a1be1639cdfc43317e4b922a054455c3c20357ee57f620ef75b2f881cd0948d02203c95b058801220c7817083ea5dbcdc39f5fc8b0926b6f263d91fc6d7b38dfc7501483045022100d60eae863096de4e0727794bb438a69359975425e66e8f86bf1c914bd5e870ef022065eca2e53e6cfec15b6216ed6dfda893e9d814980af51e3ea7c223553ce26127014c69522102bca4f8f885efc1c81ddc7df9804f1015e265026572ae33fed2bbd302b88213432103e66d7307a0cf7dba47a6a3575c6e92ccc1203afeaa381e38d48674b0b789c420210325b298bd34f022e236932b653376959e97b095a61ddf460631aa47bfa59802d053aeffffffff02939e0e000000000017a914d5c90fc3ff7fe4763c9ec2a3aa590610292c5115870fa5e277000000001976a9145a1c5ed3faac860bfb707f88a741e73c93d1a99388ac00000000";
Transaction tx = new Transaction(MainNetParams.get(), Hex.decode(hex));
Script scriptSig0 = tx.getInputs().get(1).getScriptSig();
Script scriptPub0 = tx0.getOutputs().get(0).getScriptPubKey();
// debug this line to find out which pub keys are being used
scriptSig0.correctlySpends(tx, 1, scriptPub0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment