diff --git a/GCryptLib/visualizations/create-visualizations.sh b/GCryptLib/visualizations/create-visualizations.sh new file mode 100755 index 0000000..e60193e --- /dev/null +++ b/GCryptLib/visualizations/create-visualizations.sh @@ -0,0 +1,51 @@ +#!zsh + +echo "Make sure to have run all visualization scripts in!" +echo "These generate the base images!" + +# Copy all images over, but as pngs, and a bit larger +find ../build/ -maxdepth 1 -type f -name '*.bmp' |\ + xargs -I {}\ + convert "{}"\ + -filter box\ + -resize 256x\ + "{}.png" + +mv ../build/*.png . + +# Create a few gifs + +# Singleblock diffusion +convert -delay 10 -loop 0 -dispose previous \ + "visualize-singleblock-diffusion-input.bmp.png"\ + "visualize-singleblock-diffusion-input-flip.bmp.png"\ + "visualize-singleblock-diffusion-input.gif" + +convert -delay 10 -loop 0 -dispose previous \ + "visualize-singleblock-diffusion-output.bmp.png"\ + "visualize-singleblock-diffusion-output-flip.bmp.png"\ + "visualize-singleblock-diffusion-output.gif" + + +# Multiblock diffusion +convert -delay 10 -loop 0 -dispose previous \ + "visualize-multiblock-diffusion-input.bmp.png"\ + "visualize-multiblock-diffusion-input-flip.bmp.png"\ + "visualize-multiblock-diffusion-input.gif" + +convert -delay 10 -loop 0 -dispose previous \ + "visualize-multiblock-diffusion-output.bmp.png"\ + "visualize-multiblock-diffusion-output-flip.bmp.png"\ + "visualize-multiblock-diffusion-output.gif" + +# Extreme input diffusion +convert -delay 10 -loop 0 -dispose previous \ + "visualize-extreme-input-diffusion-input.bmp.png"\ + "visualize-extreme-input-diffusion-input-flip.bmp.png"\ + "visualize-extreme-input-diffusion-input.gif" + +convert -delay 10 -loop 0 -dispose previous \ + "visualize-extreme-input-diffusion-output.bmp.png"\ + "visualize-extreme-input-diffusion-output-flip.bmp.png"\ + "visualize-extreme-input-diffusion-output.gif" + diff --git a/GCryptLib/visualizations/input-big-flip.bmp.png b/GCryptLib/visualizations/input-big-flip.bmp.png deleted file mode 100644 index 23ec9b8..0000000 Binary files a/GCryptLib/visualizations/input-big-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input-big.bmp.png b/GCryptLib/visualizations/input-big.bmp.png deleted file mode 100644 index dfc6e9e..0000000 Binary files a/GCryptLib/visualizations/input-big.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input-big.gif b/GCryptLib/visualizations/input-big.gif deleted file mode 100644 index 2c251a9..0000000 Binary files a/GCryptLib/visualizations/input-big.gif and /dev/null differ diff --git a/GCryptLib/visualizations/input-extreme-flip.bmp.png b/GCryptLib/visualizations/input-extreme-flip.bmp.png deleted file mode 100644 index 15178e2..0000000 Binary files a/GCryptLib/visualizations/input-extreme-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input-extreme-key.bmp.png b/GCryptLib/visualizations/input-extreme-key.bmp.png deleted file mode 100644 index e08f89d..0000000 Binary files a/GCryptLib/visualizations/input-extreme-key.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input-extreme.bmp.png b/GCryptLib/visualizations/input-extreme.bmp.png deleted file mode 100644 index 85d9ce5..0000000 Binary files a/GCryptLib/visualizations/input-extreme.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input-extreme.gif b/GCryptLib/visualizations/input-extreme.gif deleted file mode 100644 index f4a987d..0000000 Binary files a/GCryptLib/visualizations/input-extreme.gif and /dev/null differ diff --git a/GCryptLib/visualizations/input-flip.bmp.png b/GCryptLib/visualizations/input-flip.bmp.png deleted file mode 100644 index f1734c4..0000000 Binary files a/GCryptLib/visualizations/input-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input.bmp.png b/GCryptLib/visualizations/input.bmp.png deleted file mode 100644 index 5f84f7f..0000000 Binary files a/GCryptLib/visualizations/input.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/input.gif b/GCryptLib/visualizations/input.gif deleted file mode 100644 index 8a9558d..0000000 Binary files a/GCryptLib/visualizations/input.gif and /dev/null differ diff --git a/GCryptLib/visualizations/output-big-flip.bmp.png b/GCryptLib/visualizations/output-big-flip.bmp.png deleted file mode 100644 index ae865e8..0000000 Binary files a/GCryptLib/visualizations/output-big-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output-big.bmp.png b/GCryptLib/visualizations/output-big.bmp.png deleted file mode 100644 index 2b15790..0000000 Binary files a/GCryptLib/visualizations/output-big.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output-big.gif b/GCryptLib/visualizations/output-big.gif deleted file mode 100644 index e653f10..0000000 Binary files a/GCryptLib/visualizations/output-big.gif and /dev/null differ diff --git a/GCryptLib/visualizations/output-extreme-flip.bmp.png b/GCryptLib/visualizations/output-extreme-flip.bmp.png deleted file mode 100644 index f175415..0000000 Binary files a/GCryptLib/visualizations/output-extreme-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output-extreme.bmp.png b/GCryptLib/visualizations/output-extreme.bmp.png deleted file mode 100644 index a87437f..0000000 Binary files a/GCryptLib/visualizations/output-extreme.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output-extreme.gif b/GCryptLib/visualizations/output-extreme.gif deleted file mode 100644 index f2e1266..0000000 Binary files a/GCryptLib/visualizations/output-extreme.gif and /dev/null differ diff --git a/GCryptLib/visualizations/output-flip.bmp.png b/GCryptLib/visualizations/output-flip.bmp.png deleted file mode 100644 index 8372825..0000000 Binary files a/GCryptLib/visualizations/output-flip.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output.bmp.png b/GCryptLib/visualizations/output.bmp.png deleted file mode 100644 index 9d47342..0000000 Binary files a/GCryptLib/visualizations/output.bmp.png and /dev/null differ diff --git a/GCryptLib/visualizations/output.gif b/GCryptLib/visualizations/output.gif deleted file mode 100644 index f1ef561..0000000 Binary files a/GCryptLib/visualizations/output.gif and /dev/null differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-input-flip.bmp.png b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input-flip.bmp.png new file mode 100644 index 0000000..ea5d2e7 Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.bmp.png b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.bmp.png new file mode 100644 index 0000000..22b4bfd Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.gif b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.gif new file mode 100644 index 0000000..9a6f971 Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.gif differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-key.bmp.png b/GCryptLib/visualizations/visualize-extreme-input-diffusion-key.bmp.png new file mode 100644 index 0000000..ce46954 Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-key.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-output-flip.bmp.png b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output-flip.bmp.png new file mode 100644 index 0000000..d5bfdf2 Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.bmp.png b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.bmp.png new file mode 100644 index 0000000..c4b6fcb Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.gif b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.gif new file mode 100644 index 0000000..24a03b6 Binary files /dev/null and b/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.gif differ diff --git a/GCryptLib/visualizations/visualize-hashing-distribution-input-a.bmp.png b/GCryptLib/visualizations/visualize-hashing-distribution-input-a.bmp.png new file mode 100644 index 0000000..fd77574 Binary files /dev/null and b/GCryptLib/visualizations/visualize-hashing-distribution-input-a.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-hashing-distribution-input-b.bmp.png b/GCryptLib/visualizations/visualize-hashing-distribution-input-b.bmp.png new file mode 100644 index 0000000..2e958d6 Binary files /dev/null and b/GCryptLib/visualizations/visualize-hashing-distribution-input-b.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-hashing-distribution-output-a.bmp.png b/GCryptLib/visualizations/visualize-hashing-distribution-output-a.bmp.png new file mode 100644 index 0000000..4fadb39 Binary files /dev/null and b/GCryptLib/visualizations/visualize-hashing-distribution-output-a.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-hashing-distribution-output-b.bmp.png b/GCryptLib/visualizations/visualize-hashing-distribution-output-b.bmp.png new file mode 100644 index 0000000..d774681 Binary files /dev/null and b/GCryptLib/visualizations/visualize-hashing-distribution-output-b.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-input-flip.bmp.png b/GCryptLib/visualizations/visualize-multiblock-diffusion-input-flip.bmp.png new file mode 100644 index 0000000..a34b2e9 Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-input-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-input.bmp.png b/GCryptLib/visualizations/visualize-multiblock-diffusion-input.bmp.png new file mode 100644 index 0000000..31c0ea9 Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-input.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-input.gif b/GCryptLib/visualizations/visualize-multiblock-diffusion-input.gif new file mode 100644 index 0000000..7451b13 Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-input.gif differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-key.bmp.png b/GCryptLib/visualizations/visualize-multiblock-diffusion-key.bmp.png new file mode 100644 index 0000000..2c65c49 Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-key.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-output-flip.bmp.png b/GCryptLib/visualizations/visualize-multiblock-diffusion-output-flip.bmp.png new file mode 100644 index 0000000..15b3149 Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-output-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-output.bmp.png b/GCryptLib/visualizations/visualize-multiblock-diffusion-output.bmp.png new file mode 100644 index 0000000..15ddf0c Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-output.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-multiblock-diffusion-output.gif b/GCryptLib/visualizations/visualize-multiblock-diffusion-output.gif new file mode 100644 index 0000000..7e3ac1c Binary files /dev/null and b/GCryptLib/visualizations/visualize-multiblock-diffusion-output.gif differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-blackwhite.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-blackwhite.bmp.png new file mode 100644 index 0000000..dc7f1ef Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-blackwhite.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-getblock-color.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-getblock-color.bmp.png new file mode 100644 index 0000000..d661dfd Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-getblock-color.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-getrandom-color.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-getrandom-color.bmp.png new file mode 100644 index 0000000..d37acc2 Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-getrandom-color.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-getrandom-grayscale.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-getrandom-grayscale.bmp.png new file mode 100644 index 0000000..eceb1c3 Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-getrandom-grayscale.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-operator-color.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-operator-color.bmp.png new file mode 100644 index 0000000..0189890 Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-operator-color.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-prng-distribution-operator-grayscale.bmp.png b/GCryptLib/visualizations/visualize-prng-distribution-operator-grayscale.bmp.png new file mode 100644 index 0000000..1da8e86 Binary files /dev/null and b/GCryptLib/visualizations/visualize-prng-distribution-operator-grayscale.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-input-flip.bmp.png b/GCryptLib/visualizations/visualize-singleblock-diffusion-input-flip.bmp.png new file mode 100644 index 0000000..d1b5339 Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-input-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-input.bmp.png b/GCryptLib/visualizations/visualize-singleblock-diffusion-input.bmp.png new file mode 100644 index 0000000..0d59407 Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-input.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-input.gif b/GCryptLib/visualizations/visualize-singleblock-diffusion-input.gif new file mode 100644 index 0000000..1835d6c Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-input.gif differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-key.bmp.png b/GCryptLib/visualizations/visualize-singleblock-diffusion-key.bmp.png new file mode 100644 index 0000000..2732aac Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-key.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-output-flip.bmp.png b/GCryptLib/visualizations/visualize-singleblock-diffusion-output-flip.bmp.png new file mode 100644 index 0000000..f7bb778 Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-output-flip.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-output.bmp.png b/GCryptLib/visualizations/visualize-singleblock-diffusion-output.bmp.png new file mode 100644 index 0000000..f72605a Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-output.bmp.png differ diff --git a/GCryptLib/visualizations/visualize-singleblock-diffusion-output.gif b/GCryptLib/visualizations/visualize-singleblock-diffusion-output.gif new file mode 100644 index 0000000..f51be8c Binary files /dev/null and b/GCryptLib/visualizations/visualize-singleblock-diffusion-output.gif differ diff --git a/readme.md b/readme.md index bc18f9a..0ecc371 100644 --- a/readme.md +++ b/readme.md @@ -131,31 +131,30 @@ future output. #### Single-block diffusion `"Hello :3"` in binary, and it's ciphertext: -!["Hello :3" in binary](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input.bmp.png) +!["Hello :3" in binary](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-input.bmp.png)     -![Ciphertext 1](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output.bmp.png) - +![Ciphertext 1](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-output.bmp.png) Now, let's flip a single bit in the input: One bit flipped, and again the corresponding ciphertext: -![One bit flipped](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-flip.bmp.png) +![One bit flipped](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-input-flip.bmp.png)     -![Ciphertext for flipped bit](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output-flip.bmp.png) +![Ciphertext for flipped bit](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-output-flip.bmp.png) Let's gif them together, to better see the difference: -![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input.gif) +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-input.gif)     -![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output.gif) +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-singleblock-diffusion-output.gif) As shown, flipping even a single bit, affects the entire ciphertext. #### What about input longer than a single block? Input, and ciphertext: -![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-big.gif) +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-multiblock-diffusion-input.gif)     -![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output-big.gif) +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-multiblock-diffusion-output.gif) Notice how the ciphertext doesn't change until the block containing the bitflip is reached? This is a limitation of cipher block chaining. @@ -163,14 +162,30 @@ Notice how the ciphertext doesn't change until the block containing the bitflip How non-transparent is the cipher with extreme inputs? Even with a super problematic key?: Input, key, and ciphertext: -![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-extreme.gif) +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-extreme-input-diffusion-input.gif)     -![Key](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-extreme-key.bmp.png) +![Key](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-extreme-input-diffusion-key.bmp.png)     -![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output-extreme.gif) +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-extreme-input-diffusion-output.gif) -Notice how even cleartexts that are almost completely uniform, with a key that is just zeores, will produce ambiguous ciphertexts. -I darkened the input gif, as to not cause disorientation by flickering. +Notice how even cleartexts that are completely uniform, with a key that is almost just zeores, will still produce ambiguous ciphertexts. + +### What about the PRNG's distribution? +Check it out, here are the distributions of a few different getter-methods, some in black/white, some in grayscale, some in color. + +Blackwhite - GetBit(), Grayscale - GetRandom(), and Grayscale - operator(): +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-blackwhite.bmp.png) +    +![Key](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-getrandom-grayscale.bmp.png) +    +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-operator-grayscale.bmp.png) + +Color - GetRandom(), Color - operator(), and Color - GetBlock(): +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-getrandom-color.bmp.png) +    +![Key](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-operator-color.bmp.png) +    +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/visualize-prng-distribution-getblock-color.bmp.png) ## Noteworthy: * This is no fixed algorithm. Newer versions may very well be unable to decrypt ciphertexts encrypted with earlier versions.