[Cryptography] SHA-256 decrypted (8 rounds)
Ray Dillinger
bear at sonic.net
Sat Apr 6 02:38:16 EDT 2024
Okay, let's cut a little slack from the terminology discussion.
Do people reuse code from encryption and decryption operations to build
hash functions? Sure, sometimes. If somebody used a round function
from a cipher to build a hash, and didn't update the comments in that
code, then you might have found a comment referring to encryption and
decryption. If someone used a full cipher implementation to build a
hash, the same applies. Okay, fine, whatever.
For example if you use a fixed key for a cipher and loop through a file
twice, encrypting in CBC mode, then the final block of the
doubly-encrypted ciphertext is a good hash function (assuming the cipher
is a good cipher). And most of the program is going to be code that's
also for the cipher.
We don't actually use that doubled-CBC construction, because it's slow
and inefficient. The reason a cipher has to be applied to the _doubled_
input stream when constructing a hash from a cipher that way is to
prevent people from using cipher decryption to find a one-block preimage
of the hash, because hash functions aren't supposed to _have_ decryption
operations. That means it takes twice as long as encrypting the file if
you do it that way, so we don't. But it's a good thing to teach students
because a lot of them need to learn the thinking habits needed to
realize that someone could otherwise find a one-block preimage by
decrypting the cipher.
Anyway if I give you that final block of ciphertext you cannot "decrypt"
the 90-megabyte file that it's a hash of. Even if you know what cipher
I used, even if you know what key I used, even if you could just simply
decrypt blocks of plaintext from the cipher. There simply isn't enough
information in the hash value to specify the contents of a file longer
than 256 bits, and the way a hash function is constructed should prevent
even a one-block decryption, even if it was constructed from a cipher
you could decrypt.
If it's a bad or broken hash, then you can possibly find another input
that hashes to the same value. Whether you call it a preimage or a
decryption, the ability to find it (with less than 2^255 guesses on
average) would mean that it's a bad or broken hash.
From what I saw of your code it appears that you were trying to find a
256-bit input that hashes to the same value. That's legit. That would
be a significant result. Hashes are supposed to be hard to reverse even
when operating on small values, and most inputs have, at least in
theory, preimages much smaller than the input.
While success in finding a one-block preimage would reveal a bad or
broken hash function, it's not going to reveal any information I was
trying to protect. It won't reveal any plaintext because what you get
won't be the same 90-megabyte value that I hashed. It's not going to be
a value that I've ever seen before. It's not going to be a value that I
transmitted to you whether in encrypted form or as plaintext. Even if
that 90-megabyte file is, in fact, already contained on your own hard
drive, you should not be able to derive any information at all about the
contents of the file without running that same hash function on all your
files until you find the file that produces a matching hash.
More information about the cryptography
mailing list