From a37849a450b8da551ebe93a9ffb286eea23beaee Mon Sep 17 00:00:00 2001 From: "Andreas M. Antonopoulos" Date: Sun, 18 Aug 2013 16:50:21 -0700 Subject: [PATCH] sha256 diagram and updates --- ch01.asciidoc | 6 +++++- images/sha256-logical.png | Bin 0 -> 16029 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 images/sha256-logical.png diff --git a/ch01.asciidoc b/ch01.asciidoc index a06b8237..3b077876 100644 --- a/ch01.asciidoc +++ b/ch01.asciidoc @@ -45,7 +45,11 @@ genesis.nNonce = 2083236893; Bitcoin is secured through computation and consensus. For a new block of transactions to be added to the network, someone must first find a solution to a specific mathematical problem called the _proof of work_. Bitcoin's proof-of-work algorithm is based on the Secure Hash Algorithm (SHA-256) and consists of trying to generate a block whose hash is less than a specific number. Let's see how this works in practice. -A hashing algorithm is a cryptographic function that takes an arbitrary length input (a text message or binary file), and produce a fixed-size output called the _hash_ or _digest_. It is trivial to verify the hash of any input, but it is computationally infeasible to predict or select an input to produce a desired hash. It's a one-way function, so it can easily work one way but is impossible to reverse. +A hashing algorithm is a cryptographic function that takes an arbitrary length input (a text message or binary file), and produce a fixed-size output called the _hash_ or _digest_. It is trivial to verify the hash of any input, but it is computationally infeasible to predict or select an input to produce a desired hash. It's a one-way function, so it can easily work one way but is impossible to reverse. + +[[figure_sha256_logical]] +.The Secure Hash Algorithm (SHA-256) +image::images/sha256-logical.png["SHA256"] With SHA-256, the output is always 256 bits long, regardless of the size of the input. In the example below, we will use the Python interpreter to calculate the SHA256 hash of the phrase "I am Satoshi Nakamoto". diff --git a/images/sha256-logical.png b/images/sha256-logical.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a720fd74c5619fdb29a763c67e0a175ccab39c GIT binary patch literal 16029 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 Jg^JCy{{svAhJ*kB literal 0 HcmV?d00001