From 61331233878615a704187c3587b30101354ead27 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Mon, 6 Dec 2021 12:48:44 +0100 Subject: [PATCH] Better comments in Util.h --- GhettoCrypt/Util.h | 9 +-- INCLUDE/GhettoCrypt.cpp | 9 +-- INCLUDE/GhettoCrypt.h | 121 +++++++++++++++++++++------------------- 3 files changed, 73 insertions(+), 66 deletions(-) diff --git a/GhettoCrypt/Util.h b/GhettoCrypt/Util.h index 128102c..4b4dbbf 100644 --- a/GhettoCrypt/Util.h +++ b/GhettoCrypt/Util.h @@ -39,6 +39,7 @@ namespace GhettoCipher return std::bitset(ss.str()); } + //! Will pad a string to a set length with a certain character inline std::string PadStringToLength(const std::string& str, const std::size_t len, const char pad, const bool padLeft = true) { // Fast-reject: Already above padded length @@ -65,7 +66,7 @@ namespace GhettoCipher return ss.str(); } - //! Will convert a string to a fixed data block + //! Will convert a string to a fixed-size data block inline Block StringToBitblock(const std::string& s) { std::stringstream ss; @@ -88,7 +89,7 @@ namespace GhettoCipher return Flexblock(ss.str()); } - //! Will convert a fixed data block to a string + //! Will convert a fixed-size data block to a string inline std::string BitblockToString(const Block& bits) { std::stringstream ss; @@ -118,7 +119,7 @@ namespace GhettoCipher return ss.str(); } - //! Turns a fixed data block into a hex-string + //! Turns a fixed-size data block into a hex-string inline std::string BitblockToHexstring(const Block& b) { std::stringstream ss; @@ -145,7 +146,7 @@ namespace GhettoCipher } - //! Turns a hex string into a fixed data block + //! Turns a hex string into a fixed-size data block inline Block HexstringToBitblock(const std::string& hexstring) { std::stringstream ss; diff --git a/INCLUDE/GhettoCrypt.cpp b/INCLUDE/GhettoCrypt.cpp index 731b8c2..9b47b6a 100644 --- a/INCLUDE/GhettoCrypt.cpp +++ b/INCLUDE/GhettoCrypt.cpp @@ -31,6 +31,7 @@ /*** ./../GhettoCrypt/Cipher.cpp ***/ #include +#include GhettoCipher::Cipher::Cipher(const Block& key) : @@ -403,7 +404,7 @@ std::string GhettoCipher::GhettoCryptWrapper::DecryptString(const std::string& c return cleartext; } -bool GhettoCipher::GhettoCryptWrapper::EncryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password) +bool GhettoCipher::GhettoCryptWrapper::EncryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password, bool printProgressReport) { try { @@ -414,7 +415,7 @@ bool GhettoCipher::GhettoCryptWrapper::EncryptFile(const std::string& filename_i Cipher cipher(password); // Encrypt our cleartext bits - const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits); + const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits, printProgressReport); // Write our ciphertext bits to file WriteBitsToFile(filename_out, ciphertext_bits); @@ -427,7 +428,7 @@ bool GhettoCipher::GhettoCryptWrapper::EncryptFile(const std::string& filename_i } } -bool GhettoCipher::GhettoCryptWrapper::DecryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password) +bool GhettoCipher::GhettoCryptWrapper::DecryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password, bool printProgressReport) { try { @@ -438,7 +439,7 @@ bool GhettoCipher::GhettoCryptWrapper::DecryptFile(const std::string& filename_i Cipher cipher(password); // Decrypt the ciphertext bits - const Flexblock cleartext_bits = cipher.Decipher(ciphertext_bits); + const Flexblock cleartext_bits = cipher.Decipher(ciphertext_bits, printProgressReport); // Write our cleartext bits to file WriteBitsToFile(filename_out, cleartext_bits); diff --git a/INCLUDE/GhettoCrypt.h b/INCLUDE/GhettoCrypt.h index 09163c0..64b6767 100644 --- a/INCLUDE/GhettoCrypt.h +++ b/INCLUDE/GhettoCrypt.h @@ -28,53 +28,6 @@ #pragma once -/*** ./../GhettoCrypt/GhettoCryptWrapper.h ***/ - -#pragma once -#include - -namespace GhettoCipher -{ - /** This class is a wrapper to make working with the GhettoCipher super easy with a python-like syntax - */ - class GhettoCryptWrapper - { - public: - //! Will encrypt a string and return it hexadecimally encoded. - static std::string EncryptString(const std::string& cleartext, const std::string& password); - - //! Will decrypt a hexadecimally encoded string. - static std::string DecryptString(const std::string& ciphertext, const std::string& password); - - //! Will encrypt a file. - //! Returns false if anything goes wrong (like, file-access). - //! @filename_in The file to be read. - //! @filename_out The file the encrypted version should be saved in. - static bool EncryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password); - - //! Will decrypt a file. - //! Returns false if anything goes wrong (like, file-access). - //! @filename_in The file to be read. - //! @filename_out The file the decrypted version should be saved in. - static bool DecryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password); - - private: - // No instanciation! >:( - GhettoCryptWrapper(); - }; -} - -/*** ./../GhettoCrypt/Flexblock.h ***/ - -#pragma once -#include - -namespace GhettoCipher -{ - //! A "bitset" of variable length - typedef std::string Flexblock; -} - /*** ./../GhettoCrypt/Version.h ***/ #pragma once @@ -86,19 +39,19 @@ namespace GhettoCipher namespace GhettoCipher { - constexpr int BLOCK_SIZE = 128; + constexpr int BLOCK_SIZE = 512; constexpr int N_ROUNDS = 64; } -/*** ./../GhettoCrypt/Halfblock.h ***/ +/*** ./../GhettoCrypt/Flexblock.h ***/ #pragma once -#include +#include namespace GhettoCipher { - constexpr int HALFBLOCK_SIZE = (BLOCK_SIZE / 2); - typedef std::bitset Halfblock; + //! A "bitset" of variable length + typedef std::string Flexblock; } /*** ./../GhettoCrypt/Block.h ***/ @@ -152,6 +105,7 @@ namespace GhettoCipher return std::bitset(ss.str()); } + //! Will pad a string to a set length with a certain character inline std::string PadStringToLength(const std::string& str, const std::size_t len, const char pad, const bool padLeft = true) { // Fast-reject: Already above padded length @@ -178,7 +132,7 @@ namespace GhettoCipher return ss.str(); } - //! Will convert a string to a fixed data block + //! Will convert a string to a fixed-size data block inline Block StringToBitblock(const std::string& s) { std::stringstream ss; @@ -201,7 +155,7 @@ namespace GhettoCipher return Flexblock(ss.str()); } - //! Will convert a fixed data block to a string + //! Will convert a fixed-size data block to a string inline std::string BitblockToString(const Block& bits) { std::stringstream ss; @@ -231,7 +185,7 @@ namespace GhettoCipher return ss.str(); } - //! Turns a fixed data block into a hex-string + //! Turns a fixed-size data block into a hex-string inline std::string BitblockToHexstring(const Block& b) { std::stringstream ss; @@ -258,7 +212,7 @@ namespace GhettoCipher } - //! Turns a hex string into a fixed data block + //! Turns a hex string into a fixed-size data block inline Block HexstringToBitblock(const std::string& hexstring) { std::stringstream ss; @@ -312,14 +266,18 @@ namespace GhettoCipher return ss.str(); } - //! Creates a key of size key-size from a password of arbitrary length. + //! Creates a key of size BLOCK_SIZE from a password of arbitrary length. + //! Using passwords larger (in bits) than BLOCK_SIZE is not generally recommended. + //! Note that if your password is shorter (in bits) than BLOCK_SIZE, the rest of the key will be padded with 0x0. Further round-keys will be extrapolated though. inline Block PasswordToKey(const std::string& in) { Block b; // Segment the password in segments of key-size, and xor them together. for (std::size_t i = 0; i < in.size(); i += BLOCK_SIZE / 8) - b ^= StringToBitblock(in.substr(i, BLOCK_SIZE / 8)); + b ^= StringToBitblock( + PadStringToLength(in.substr(i, BLOCK_SIZE / 8), BLOCK_SIZE / 8, 0, false) + ); return b; } @@ -377,6 +335,17 @@ namespace GhettoCipher typedef std::array Keyset; } +/*** ./../GhettoCrypt/Halfblock.h ***/ + +#pragma once +#include + +namespace GhettoCipher +{ + constexpr int HALFBLOCK_SIZE = (BLOCK_SIZE / 2); + typedef std::bitset Halfblock; +} + /*** ./../GhettoCrypt/Feistel.h ***/ #pragma once @@ -437,6 +406,42 @@ namespace GhettoCipher }; } +/*** ./../GhettoCrypt/GhettoCryptWrapper.h ***/ + +#pragma once +#include + +namespace GhettoCipher +{ + /** This class is a wrapper to make working with the GhettoCipher super easy with a python-like syntax + */ + class GhettoCryptWrapper + { + public: + //! Will encrypt a string and return it hexadecimally encoded. + static std::string EncryptString(const std::string& cleartext, const std::string& password); + + //! Will decrypt a hexadecimally encoded string. + static std::string DecryptString(const std::string& ciphertext, const std::string& password); + + //! Will encrypt a file. + //! Returns false if anything goes wrong (like, file-access). + //! @filename_in The file to be read. + //! @filename_out The file the encrypted version should be saved in. + static bool EncryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password, bool printProgressReport = false); + + //! Will decrypt a file. + //! Returns false if anything goes wrong (like, file-access). + //! @filename_in The file to be read. + //! @filename_out The file the decrypted version should be saved in. + static bool DecryptFile(const std::string& filename_in, const std::string& filename_out, const std::string& password, bool printProgressReport = false); + + private: + // No instanciation! >:( + GhettoCryptWrapper(); + }; +} + /*** ./../GhettoCrypt/Cipher.h ***/ #pragma once