I am trying to convert a bitcoin address and have the following code from here (Calculate Segwit address from public address, 2nd answer):
Step1: $ printf 1L88S26C5oyjL1gkXsBeYwHHjvGvCcidr9 > adr.txt Step2: $ printf $( cat adr.txt | sed 's/[[:xdigit:]]\{2\}/\\x&/g' ) >adr.hex Step3: $ openssl dgst -sha256 -binary <adr.hex >tmp_sha256.hex Step4: $ openssl dgst -ripemd160 <tmp_sha256.hex ## result should be: 56379c7bcd6b41188854e74169f844e8676cf8b8 Now I want to do this in Java. I currently have the following code. No matter what I try, I dont get the correct result. :(
String address = "1L88S26C5oyjL1gkXsBeYwHHjvGvCcidr9"; // step 1 System.out.println("address: " + address); String addressHex = toHex(address); System.out.println("address hex: " + addressHex); byte[] addressBytes = addressHex.getBytes(StandardCharsets.UTF_8); // step 2 MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(addressBytes); // step 3 RIPEMD160Digest digest2 = new RIPEMD160Digest(); // steps 4 digest2.update(hash, 0, hash.length); byte[] out = new byte[20]; digest2.doFinal(out, 0); System.out.println("result: " + bytesToHex(out)); // = 62ab42cba5d2632d1350fafb2587f5d2ece445d3 // should be 56379c7bcd6b41188854e74169f844e8676cf8b8 Output:
address: 1L88S26C5oyjL1gkXsBeYwHHjvGvCcidr9 address hex: 314c383853323643356f796a4c31676b58734265597748486a764776436369647239 result: 62ab42cba5d2632d1350fafb2587f5d2ece445d3 Can someone help me? I think the problem is somewhere doing the conversion String/hex/byte ...? I tried really hard, but cannot find the correct way to do it.
I also tried to convert the address to hex and after that to bytes, but doesnt work neither. :/
// updated post ... still doesnt show the correct result :/
// update2:
byte[] address = ("1L88S26C5oyjL1gkXsBeYwHHjvGvCcidr9").getBytes(); System.out.println("address byte array: " + address); String addressHex = bytesToHex(address); System.out.println("address hex: " + addressHex); byte[] addressBytes = addressHex.getBytes(); MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(addressBytes); RIPEMD160Digest digest2 = new RIPEMD160Digest(); digest2.update(hash, 0, hash.length); byte[] out = new byte[20]; digest2.doFinal(out, 0); System.out.println("result: " + bytesToHex(out)); Output
address byte array: [B@108c4c35 address hex: 314c383853323643356f796a4c31676b58734265597748486a764776436369647239 result: 62ab42cba5d2632d1350fafb2587f5d2ece445d3