On Friday, June 9th, zden posted another riddle (Level 4) of his famous crypto series with a Bitcoin reward on http://crypto.haluska.sk:
As in his previous riddles, he asks us to find a private Bitcoin key. Sometimes it was encoded as 256 bits, sometimes as a WIF key in base58 (example: 5K4p2evzEzhM7vRihePiunUM9oaEMmStSU6GWKPDHnSbC49boLM)
On first sight, the information in the picture seems overwhelming: curves, circles of different radii, dots, ... I will try to lead you through some of the steps of my approach of breaking down the puzzle in its pieces, analyse them and recombine them to find the reward.
The hidden grid(s!)
There seem to be two different kind of markings: circles and dots. It becomes clear, that there must be two different kind of grids. I marked them green (for dots) and red (for circles):
Another thing which is important to realize was the fact, that each (inner) circle on the red grid has radius 12. They are a marking for points on a grid, as it is the case for the dots on the other grid.
The Bézier curves
The curves seem to be Bézier curves, known from many drawing programs. In this case, they are constructed from three points: the two outer ones, connecting either two dots (case A, on green grid) or two circles (case B, on red grid). The middle point of each Bézier curve lays on the other grid (case A: on the red grid, case B: in the green grid).
Some dots are not connected by any Bézier curve. As it turned out, they are the middle point of some of the Bézier curves. As zden mentioned in a tweet, the riddle could be solved by pen and paper: these markings help to determine the three points of each Bézier curve manually. (Thanks, zden ;) ! )
The picture above looks very confusing. To make understanding easier (for myself), I needed to create a new picture just with the relevant information:
- The position of dots/circles on each grid
- The curves
- And wait... a third information: some of the circles/dots have bigger circles around them... So we extract their radii (minus 13) and print them next to the points on the grid:
This picture contains almost all important information and is much easier to understand
Wow: the radii are showing a kind of order, no two ones are the same!
And ... aha! There are 17 curves. Each curve has 3 elements (points). 17 * 3 = 51!
A bitcoin private key in WIF has 51 characters!! Might it be that every grid point is a character from the base58 alphabet? I ran a program which assigns every grid point an ASCII character, going either from top to bottom/or reversed and left to right/or reversed with different offsets in the ASCII set. In WIF, the private key always starts with a 5. By setting the condition that at least one "5" must be occupied by a point on a grid and only letters from the Base58 alphabet must be occupied, I found the following mapping:
Now... there is something, showing us that we are on the right path: there is one curve connecting a "5" and a "J". A "J" often follows the "5" in a private key, with other possibilities being an "H" or "K" (https://en.bitcoin.it/wiki/Base58Check_encoding). This curve is strange: every other curve has a number (a circle with radius > 12) and a simple grid point without number. This curve clearly must be the beginning of the private key... So it means that radius 12 must also be considered as a number (Mean trick by zden :P!). Following our scheme, this is position "-1". It can be on the position with character "5" or on "n". We can not know! We have to try both possibilites (another mean trick :D) (in the end it turned out that it is the "n", which means this point is circled with "7" and "-1": radius 20px and 12px).
In the end, each curve must be read this way: The point without outer circle (without number on the reconstructed picture) is the first character of this curve. The second Bézier point is the second character. And the point with outer circle is the third one.
I tried many more possibilites and often got stuck. It was not clear to me in the beginning how many grid points each grid actually has. This is crucial though for the correct letter assignment.
In the beginning I also tried to find 256 bits. None of the assignments resulted in the number 256 though.
So even though the solution might look straigtforward, there were a lot of different dead ends. But for me, this is exactly why I love zden's Crypto series so much: the puzzles contain their own hints and it is rewarding to find key elements which show that you are on the right track (e.g. finding 51 pieces of information, finding a grid-letter assignment which makes sense, finding the start of a private key "5J..." etc).
Thank you very much zden for another great riddle and thank YOU for reading until here :)