From cdbb52b24c83adf2280a36b68a2569b0894fab71 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sun, 13 Mar 2022 15:08:29 +0100 Subject: [PATCH] Added support for a variety of output base formats --- GhettoCryptCLI/BaseConversion.h | 235 ++++ GhettoCryptCLI/Bases.h | 1101 +++++++++++++++++ GhettoCryptCLI/CommandlineInterface.cpp | 18 + GhettoCryptCLI/ContainerUtility.h | 41 + GhettoCryptCLI/GhettoCryptCLI.vcxproj | 2 + GhettoCryptCLI/GhettoCryptCLI.vcxproj.filters | 6 + GhettoCryptCLI/main.cpp | 71 +- 7 files changed, 1471 insertions(+), 3 deletions(-) create mode 100644 GhettoCryptCLI/BaseConversion.h create mode 100644 GhettoCryptCLI/Bases.h create mode 100644 GhettoCryptCLI/ContainerUtility.h diff --git a/GhettoCryptCLI/BaseConversion.h b/GhettoCryptCLI/BaseConversion.h new file mode 100644 index 0000000..5056841 --- /dev/null +++ b/GhettoCryptCLI/BaseConversion.h @@ -0,0 +1,235 @@ +#ifndef GENERALUTILITY_BASECONVERSION_H +#define GENERALUTILITY_BASECONVERSION_H + +#include +#include +#include +#include + +#include "ContainerUtility.h" + +namespace Leonetienne { + namespace GeneralUtility { + + class BaseConversion { + public: + //! Will divide a number of arbitrary base in `dividend` by an integer divisor. + //! This is a specific helper function for the base conversion functions. + //! \tparam T_Container The type of container used for the digitstring + //! \param dividend The number to be divided in listlike container-form (such as a string) + //! \param divisor The integer divisor + //! \param set The set/base of `dividend` + //! \return A pair of the result. (result, rest) + template + static std::pair + DigitstringDivision(const T_Container& dividend, const unsigned int divisor, const T_Container& set); + + //! Will convert a number of arbitrary base to base 10 + //! \tparam T_Container The type of container used for the digitstring + //! \param num A listlike container representing the number (such as a string) + //! \param set The set/base of the number + //! \return A 64-bit integer representing the number + template + static std::uint64_t BaseX_2_10(const T_Container& num, const T_Container& set); + + //! Will convert a number to an arbitrary base. + //! This just a wrapper for BaseX_2_Y. + //! \tparam T_Container The type of container used for the digitstring + //! \param num The number to be converted + //! \param set The desired set/base for the output to be in. Should be a listlike container (such as a string) + //! \param minOutLen The minimum output length. Setting this will result in zero-padded output (Like, 00000001 instead of 1) + //! \return `num` in base `set` + template + static T_Container + Base10_2_X(const std::uint64_t& num, const T_Container& set, const std::uint32_t minOutLen = 1); + + //! Will convert a number from an arbitrary base to another arbitrary base. + //! \tparam T_ContainerIn The type of container used for the incoming digitstring + //! \tparam T_ContainerOut The type of container used for the outgoing digitstring + //! \param num A representation of a number in a listlike container (such as a string) + //! \param set_in The set/base of the input + //! \param set_out The desired set/base to output + //! \param minOutLen The minimum output length. Setting this will result in zero-padded output (Like, 00000001 instead of 1) + //! \return `num` in base `set_out` + template + static T_ContainerOut + BaseX_2_Y(const T_ContainerIn& num, const T_ContainerIn& set_in, const T_ContainerOut& set_out, + const std::uint32_t minOutLen = 1); + + private: + // No instantiation! >:( + BaseConversion(); + }; + + namespace { + // Fast 64-bit int power function + inline std::uint64_t Powuli(const std::uint64_t& b, const std::uint64_t& e) { + std::uint64_t buf = 1; + + for (std::uint64_t i = 0; i < e; i++) + buf *= b; + + return buf; + } + } + + template + std::uint64_t BaseConversion::BaseX_2_10(const T_Container& num, const T_Container& set) { + // If base is 0, throw logic error + if (set.size() == 0) + throw std::logic_error("Can't convert from base0! Please supply a nonempty set!"); + + unsigned long long int buf = 0; + for (std::size_t i = 0; i < num.size(); i++) { + for (std::size_t j = 0; j < set.size(); j++) { + if (num[i] == set[j]) { + buf += Powuli((std::uint64_t)set.size(), (uint64_t)(num.size() - (i + 1))) * j; + break; + } + } + } + + return buf; + } + + // Based on: https://www.geeksforgeeks.org/divide-large-number-represented-string/ + template + std::pair + BaseConversion::DigitstringDivision(const T_Container& dividend, const unsigned int divisor, + const T_Container& set) { + // Quick rejects: + + // No set? Throw logic error + if (set.size() == 0) + throw std::logic_error("Can't divide a number of base0! Please supply a nonempty set!"); + + // No division by 0 + if (divisor == 0) + throw std::overflow_error("Division by zero!"); + + // Dividend size 0? Return 0. + if (dividend.size() == 0) + return std::make_pair(T_Container({ set[0] }), 0); + + // Verify that all digits are represented in the set/base + for (const auto& c : dividend) + if (ContainerUtility::Ord(c, set) == -1) + throw std::logic_error( + "The supplied dividend contains a digit that is not represented in the set/base!"); + + + // Now for the actual algorithm: + T_Container result; + + // Find prefix of number that is larger than divisor. + int idx = 0; + int temp = ContainerUtility::Ord(dividend[idx], set); + while (temp < divisor) { + idx++; + if (idx < dividend.size()) + temp = temp * set.size() + ContainerUtility::Ord(dividend[idx], set); + else + break; + } + + // Repeatedly divide divisor with temp. After + // every division, update temp to include one + // more digit. + int curRest = temp % divisor; + while (dividend.size() > idx) { + // Store result in answer i.e. temp / divisor + result.insert(result.cend(), set[temp / divisor]); + curRest = temp % divisor; + + // Take next digit of number + idx++; + if (idx < dividend.size()) + temp = (temp % divisor) * set.size() + ContainerUtility::Ord(dividend[idx], set); + } + + // If divisor is greater than number + if (result.size() == 0) { + // Generate 0-value digitstring + result.clear(); + result.insert(result.cend(), set[0]); + return std::make_pair(result, BaseX_2_10(dividend, set)); + } + + // else return the answer + return std::make_pair(result, curRest); + } + + template + T_ContainerOut + BaseConversion::BaseX_2_Y(const T_ContainerIn& num, const T_ContainerIn& set_in, const T_ContainerOut& set_out, + const std::uint32_t minOutLen) { + if ((set_in.size() == 0) || (set_out.size() == 0)) + throw std::logic_error("Can't convert from or to base0! Please supply a nonempty set!"); + + T_ContainerOut result; + + // Generate a 0-value string for inbase + const T_ContainerIn zeroInbase({ set_in[0] }); + + if (num != zeroInbase) { + // Populate result object + { + T_ContainerIn buf = num; + while (buf != zeroInbase) { + const auto divRes = DigitstringDivision(buf, set_out.size(), set_in); + const std::uint64_t mod = divRes.second; + buf = divRes.first; + result.insert(result.cend(), set_out[mod]); + } + } + + // Reverse result object item order + { + // Now reverse result + T_ContainerOut buf = result; + result.clear(); + for (std::size_t i = 0; i < buf.size(); i++) + result.insert(result.cend(), buf[buf.size() - i - 1]); + } + } + else { + // If num is 0, just pass a null-value. The algorithm would hang otherwise. + result.insert(result.cend(), set_out[0]); + } + + + // Add as much null-values to the left as requested. + if (result.size() < minOutLen) { + const std::size_t cachedLen = result.size(); + const T_ContainerOut cachedStr = result; + result.clear(); + for (std::size_t i = 0; i < minOutLen - cachedLen; i++) + result.insert(result.cend(), set_out[0]); + + for (const auto& it : cachedStr) + result.insert(result.cend(), it); + } + + return result; + } + + template + T_Container + BaseConversion::Base10_2_X(const std::uint64_t& num, const T_Container& set, const std::uint32_t minOutLen) { + // Convert num to a string + std::stringstream ss; + ss << num; + const std::string numStr = ss.str(); + + // Use BaseX_2_Y to convert to outbase + const T_Container convertedNum = BaseX_2_Y(numStr, "0123456789", set, minOutLen); + + // return it + return convertedNum; + } + + + } +} + +#endif //GENERALUTILITY_BASECONVERSION_H diff --git a/GhettoCryptCLI/Bases.h b/GhettoCryptCLI/Bases.h new file mode 100644 index 0000000..e553828 --- /dev/null +++ b/GhettoCryptCLI/Bases.h @@ -0,0 +1,1101 @@ +#pragma once +#include +#include + +// Actually useful bases +static const std::string BASE_2 = "01"; +static const std::string BASE_8 = "01234567"; +static const std::string BASE_10 = "0123456789"; +static const std::string BASE_16 = "0123456789abcdef"; +static const std::string BASE_64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + +// Meme bases +static const std::vector BASE_UWU = { + "uwu", + "UwU", + "<3", + ":3", + "^.^", + "^_^", + "devewopa", + "cutieee", + "cutewr", + "whiiiich", + "^^", + "XD", + "XDD", + "XDDD", + "xD", + "xDD", + "xDDD", + "masta", + "mastaaaa", + "hiiiii", + "hewwo", + "soopa", + "doopa", + "favowite", + "kawaii", + "rawr", + "xDDD", + "keewl", + "keeeewl", + ":p", + "Owww", + "Awww", + "haaaai", + "haaaay", + "heeeey", + "heeeei", + "senpaiiii", + "senpaiiiw", + "sewnpaiii", + ":o", + "(*^.^*)", + "(*^_^*)", + "i", + "nyeed", + "awe", + "youuu", + "twe", + "best", + "ruff", + "me" +}; + +static const std::vector BASE_EMOJI = { + u8"\U0001F39F", + u8"\U0001F6A1", + u8"\U00002708", + u8"\U0001F6EC", + u8"\U0001F6EB", + u8"\U000023F0", + u8"\U00002697", + u8"\U0001F47E", + u8"\U0001F691", + u8"\U0001F3C8", + u8"\U0001F3FA", + u8"\U00002693", + u8"\U0001F4A2", + u8"\U0001F620", + u8"\U0001F627", + u8"\U0001F41C", + u8"\U0001F4F6", + u8"\U0001F504", + u8"\U00002652", + u8"\U00002648", + u8"\U00002935", + u8"\U00002934", + u8"\U0001F69B", + u8"\U0001F3A8", + u8"\U0001F632", + u8"\U0001F45F", + u8"\U0000269B", + u8"\U0001F346", + u8"\U0001F3E7", + u8"\U0001F697", + u8"\U0001F697", + u8"\U0001F476", + u8"\U0001F47C", + u8"\U0001F37C", + u8"\U0001F424", + u8"\U0001F6BC", + u8"\U0001F519", + u8"\U0001F42B", + u8"\U0001F3F8", + u8"\U0001F6C4", + u8"\U0001F388", + u8"\U0001F5F3", + u8"\U00002611", + u8"\U0001F34C", + u8"\U0001F3E6", + u8"\U0001F4B5", + u8"\U0001F4B6", + u8"\U0001F4B7", + u8"\U0001F4B4", + u8"\U0001F4CA", + u8"\U0001F488", + u8"\U000026BE", + u8"\U0001F3C0", + u8"\U0001F6C0", + u8"\U0001F6C1", + u8"\U0001F50B", + u8"\U0001F3D6", + u8"\U0001F43B", + u8"\U0001F493", + u8"\U0001F6CF", + u8"\U0001F37A", + u8"\U0001F514", + u8"\U0001F515", + u8"\U0001F6CE", + u8"\U0001F371", + u8"\U0001F6B2", + u8"\U0001F6B4", + u8"\U0001F459", + u8"\U0001F3B1", + u8"\U00002623", + u8"\U0001F426", + u8"\U0001F382", + u8"\U000023FA", + u8"\U00002663", + u8"\U00002666", + u8"\U000023EC", + u8"\U00002665", + u8"\U00002B1B", + u8"\U000023EA", + u8"\U000023EE", + u8"\U000025C0", + u8"\U000025FE", + u8"\U000025FC", + u8"\U00002712", + u8"\U00002753", + u8"\U000023E9", + u8"\U000023ED", + u8"\U000025B6", + u8"\U000023EF", + u8"\U000027A1", + u8"\U00002702", + u8"\U000025AA", + u8"\U00002660", + u8"\U0001F532", + u8"\U000023F9", + u8"\U00002600", + u8"\U0000260E", + u8"\U0000260E", + u8"\U0000267B", + u8"\U000023EB", + u8"\U0001F33C", + u8"\U0001F421", + u8"\U0001F4D8", + u8"\U0001F499", + u8"\U0001F417", + u8"\U0001F4A3", + u8"\U0001F516", + u8"\U0001F4D1", + u8"\U0001F4DA", + u8"\U0001F37E", + u8"\U0001F490", + u8"\U0001F3F9", + u8"\U0001F3B3", + u8"\U0001F466", + u8"\U0001F35E", + u8"\U0001F470", + u8"\U0001F309", + u8"\U0001F4BC", + u8"\U0001F494", + u8"\U0001F41B", + u8"\U0001F3D7", + u8"\U0001F32F", + u8"\U0001F68C", + u8"\U0001F68F", + u8"\U0001F464", + u8"\U0001F465", + u8"\U0001F335", + u8"\U0001F4C5", + u8"\U0001F4F7", + u8"\U0001F4F8", + u8"\U0001F3D5", + u8"\U0000264B", + u8"\U0001F56F", + u8"\U0001F36C", + u8"\U00002651", + u8"\U0001F5C3", + u8"\U0001F4C7", + u8"\U0001F5C2", + u8"\U0001F3A0", + u8"\U0001F38F", + u8"\U0001F408", + u8"\U0001F431", + u8"\U0001F639", + u8"\U0001F63C", + u8"\U000026D3", + u8"\U0001F4C9", + u8"\U0001F4C8", + u8"\U0001F4B9", + u8"\U0001F4E3", + u8"\U0001F9C0", + u8"\U0001F3C1", + u8"\U0001F352", + u8"\U0001F338", + u8"\U0001F330", + u8"\U0001F414", + u8"\U0001F6B8", + u8"\U0001F43F", + u8"\U0001F36B", + u8"\U0001F384", + u8"\U000026EA", + u8"\U0001F3A6", + u8"\U0001F251", + u8"\U0001F250", + u8"\U00003297", + u8"\U00003299", + u8"\U000024C2", + u8"\U0001F3AA", + u8"\U0001F3D9", + u8"\U0001F306", + u8"\U0001F3AC", + u8"\U0001F44F", + u8"\U0001F3DB", + u8"\U0001F37B", + u8"\U0001F4CB", + u8"\U0001F563", + u8"\U0001F557", + u8"\U0001F566", + u8"\U0001F55A", + u8"\U0001F560", + u8"\U0001F554", + u8"\U0001F55F", + u8"\U0001F553", + u8"\U0001F564", + u8"\U0001F558", + u8"\U0001F55C", + u8"\U0001F550", + u8"\U0001F562", + u8"\U0001F556", + u8"\U0001F561", + u8"\U0001F555", + u8"\U0001F565", + u8"\U0001F559", + u8"\U0001F55E", + u8"\U0001F552", + u8"\U0001F567", + u8"\U0001F55B", + u8"\U0001F55D", + u8"\U0001F551", + u8"\U0001F503", + u8"\U0001F501", + u8"\U0001F502", + u8"\U0001F4D5", + u8"\U0001F510", + u8"\U0001F4EA", + u8"\U0001F4EB", + u8"\U0001F302", + u8"\U00002601", + u8"\U0001F329", + u8"\U0001F327", + u8"\U0001F328", + u8"\U0001F32A", + u8"\U0001F378", + u8"\U000026B0", + u8"\U0001F4A5", + u8"\U0001F4A5", + u8"\U00002604", + u8"\U0001F5DC", + u8"\U0001F38A", + u8"\U0001F616", + u8"\U0001F615", + u8"\U0001F6A7", + u8"\U0001F477", + u8"\U0001F39B", + u8"\U0001F3EA", + u8"\U0001F35A", + u8"\U0001F36A", + u8"\U0001F373", + u8"\U000000A9", + u8"\U0001F6CB", + u8"\U0001F491", + u8"\U0001F404", + u8"\U0001F42E", + u8"\U0001F980", + u8"\U0001F4B3", + u8"\U0001F319", + u8"\U0001F3CF", + u8"\U0001F40A", + u8"\U0000274C", + u8"\U0001F38C", + u8"\U00002694", + u8"\U0001F451", + u8"\U0001F63F", + u8"\U0001F622", + u8"\U0001F52E", + u8"\U000027B0", + u8"\U0001F4B1", + u8"\U0001F35B", + u8"\U0001F36E", + u8"\U0001F6C3", + u8"\U0001F300", + u8"\U0001F5E1", + u8"\U0001F483", + u8"\U0001F361", + u8"\U0001F576", + u8"\U0001F4A8", + u8"\U0001F333", + u8"\U0001F69A", + u8"\U0001F3EC", + u8"\U0001F3DA", + u8"\U0001F3DC", + u8"\U0001F3DD", + u8"\U0001F5A5", + u8"\U0001F4A0", + u8"\U0001F3AF", + u8"\U0001F625", + u8"\U0001F61E", + u8"\U0001F635", + u8"\U0001F4AB", + u8"\U0001F6AF", + u8"\U0001F415", + u8"\U0001F436", + u8"\U0001F42C", + u8"\U0001F42C", + u8"\U0001F6AA", + u8"\U000027BF", + u8"\U0000203C", + u8"\U000023F8", + u8"\U0001F369", + u8"\U0001F54A", + u8"\U0001F53B", + u8"\U0001F53D", + u8"\U00002B07", + u8"\U0001F409", + u8"\U0001F432", + u8"\U0001F457", + u8"\U0001F42A", + u8"\U0001F4A7", + u8"\U0001F4C0", + u8"\U0001F4E7", + u8"\U0001F442", + u8"\U0001F33D", + u8"\U0001F33E", + u8"\U0001F30E", + u8"\U0001F30F", + u8"\U0001F30D", + u8"\U00002734", + u8"\U00002733", + u8"\U000023CF", + u8"\U0001F4A1", + u8"\U0001F50C", + u8"\U0001F526", + u8"\U0001F418", + u8"\U0001F3FB", + u8"\U0001F3FC", + u8"\U0001F3FD", + u8"\U0001F3FE", + u8"\U0001F3FF", + u8"\U0001F51A", + u8"\U00002709", + u8"\U00002709", + u8"\U0001F4E9", + u8"\U0001F3F0", + u8"\U0001F3E4", + u8"\U0001F332", + u8"\U00002049", + u8"\U0001F611", + u8"\U0001F47D", + u8"\U0001F441", + u8"\U0001F453", + u8"\U0001F440", + u8"\U0001F486", + u8"\U0001F60B", + u8"\U0001F631", + u8"\U0001F618", + u8"\U0001F613", + u8"\U0001F915", + u8"\U0001F624", + u8"\U0001F637", + u8"\U0001F645", + u8"\U0001F646", + u8"\U0001F62E", + u8"\U0001F630", + u8"\U0001F644", + u8"\U0001F61B", + u8"\U0001F61D", + u8"\U0001F61C", + u8"\U0001F602", + u8"\U0001F912", + u8"\U0001F636", + u8"\U0001F3ED", + u8"\U0001F342", + u8"\U0001F46A", + u8"\U0001F385", + u8"\U0001F4E0", + u8"\U0001F628", + u8"\U0001F3A1", + u8"\U000026F4", + u8"\U0001F3D1", + u8"\U0001F5C4", + u8"\U0001F4C1", + u8"\U0001F39E", + u8"\U0001F4FD", + u8"\U0001F525", + u8"\U0001F692", + u8"\U0001F387", + u8"\U0001F386", + u8"\U0001F313", + u8"\U0001F31B", + u8"\U0001F41F", + u8"\U0001F365", + u8"\U0001F3A3", + u8"\U0001F44A", + u8"\U0001F44A", + u8"\U000026F3", + u8"\U0000269C", + u8"\U0001F4AA", + u8"\U0001F4BE", + u8"\U0001F3B4", + u8"\U0001F633", + u8"\U0001F32B", + u8"\U0001F301", + u8"\U0001F463", + u8"\U0001F374", + u8"\U0001F37D", + u8"\U000026F2", + u8"\U0001F340", + u8"\U0001F5BC", + u8"\U0001F35F", + u8"\U0001F364", + u8"\U0001F438", + u8"\U0001F425", + u8"\U0001F626", + u8"\U000026FD", + u8"\U0001F315", + u8"\U0001F31D", + u8"\U000026B1", + u8"\U0001F3B2", + u8"\U00002699", + u8"\U0001F48E", + u8"\U0000264A", + u8"\U0001F47B", + u8"\U0001F467", + u8"\U0001F310", + u8"\U0001F31F", + u8"\U0001F410", + u8"\U0001F3CC", + u8"\U0001F393", + u8"\U0001F347", + u8"\U0001F34F", + u8"\U0001F4D7", + u8"\U0001F49A", + u8"\U0001F62C", + u8"\U0001F638", + u8"\U0001F600", + u8"\U0001F601", + u8"\U0001F497", + u8"\U0001F482", + u8"\U0001F3B8", + u8"\U0001F487", + u8"\U0001F354", + u8"\U0001F528", + u8"\U00002692", + u8"\U0001F6E0", + u8"\U0001F439", + u8"\U0001F45C", + u8"\U0001F64B", + u8"\U0001F423", + u8"\U0001F3A7", + u8"\U0001F649", + u8"\U0001F49F", + u8"\U0001F498", + u8"\U0001F49D", + u8"\U00002764", + u8"\U00002714", + u8"\U00002797", + u8"\U0001F4B2", + u8"\U00002757", + u8"\U00002757", + u8"\U00002763", + u8"\U00002B55", + u8"\U00002796", + u8"\U00002716", + u8"\U00002795", + u8"\U0001F681", + u8"\U00002388", + u8"\U000026D1", + u8"\U0001F33F", + u8"\U0001F33A", + u8"\U0001F460", + u8"\U0001F684", + u8"\U0001F685", + u8"\U0001F506", + u8"\U000026A1", + u8"\U0001F52A", + u8"\U0001F52A", + u8"\U0001F573", + u8"\U0001F36F", + u8"\U0001F41D", + u8"\U0001F6A5", + u8"\U0001F40E", + u8"\U0001F434", + u8"\U0001F3C7", + u8"\U0001F3E5", + u8"\U00002615", + u8"\U0001F32D", + u8"\U0001F336", + u8"\U00002668", + u8"\U0001F3E8", + u8"\U0000231B", + u8"\U000023F3", + u8"\U0001F3E0", + u8"\U0001F3D8", + u8"\U0001F3E1", + u8"\U0001F917", + u8"\U0001F4AF", + u8"\U0001F62F", + u8"\U0001F368", + u8"\U0001F3D2", + u8"\U000026F8", + u8"\U0001F47F", + u8"\U0001F4E5", + u8"\U0001F4E8", + u8"\U0001F481", + u8"\U00002139", + u8"\U0001F520", + u8"\U0001F524", + u8"\U0001F521", + u8"\U0001F522", + u8"\U0001F523", + u8"\U0001F3EE", + u8"\U0001F3EE", + u8"\U0001F383", + u8"\U0001F3EF", + u8"\U0001F38E", + u8"\U0001F47A", + u8"\U0001F479", + u8"\U0001F3E3", + u8"\U0001F530", + u8"\U0001F456", + u8"\U0001F579", + u8"\U0001F54B", + u8"\U0001F511", + u8"\U00002328", + u8"\U0001F51F", + u8"\U0001F458", + u8"\U0001F48F", + u8"\U0001F48B", + u8"\U0001F63D", + u8"\U0001F617", + u8"\U0001F61A", + u8"\U0001F619", + u8"\U0001F428", + u8"\U0001F3F7", + u8"\U0001F41E", + u8"\U0001F535", + u8"\U0001F537", + u8"\U0001F536", + u8"\U0001F534", + u8"\U0001F317", + u8"\U0001F31C", + u8"\U0000271D", + u8"\U0001F343", + u8"\U0001F4D2", + u8"\U0001F50D", + u8"\U0001F6C5", + u8"\U00002194", + u8"\U000021A9", + u8"\U00002B05", + u8"\U0001F34B", + u8"\U0000264C", + u8"\U0001F406", + u8"\U0001F39A", + u8"\U0000264E", + u8"\U0001F688", + u8"\U0001F517", + u8"\U0001F587", + u8"\U0001F981", + u8"\U0001F484", + u8"\U0001F512", + u8"\U0001F50F", + u8"\U0001F36D", + u8"\U0001F62D", + u8"\U0001F3E9", + u8"\U0001F48C", + u8"\U0001F505", + u8"\U0001F58A", + u8"\U0001F58D", + u8"\U0001F58B", + u8"\U0001F58C", + u8"\U0001F004", + u8"\U0001F468", + u8"\U0001F46B", + u8"\U0001F574", + u8"\U0001F472", + u8"\U0001F473", + u8"\U0001F45E", + u8"\U0001F45E", + u8"\U0001F570", + u8"\U0001F341", + u8"\U0001F356", + u8"\U000026AB", + u8"\U000026AA", + u8"\U0001F348", + u8"\U0001F4DD", + u8"\U0001F4DD", + u8"\U0001F54E", + u8"\U0001F6B9", + u8"\U0001F687", + u8"\U0001F3A4", + u8"\U0001F52C", + u8"\U0001F396", + u8"\U0001F30C", + u8"\U0001F690", + u8"\U0001F4BD", + u8"\U0001F4F1", + u8"\U0001F4F4", + u8"\U0001F4F2", + u8"\U0001F911", + u8"\U0001F4B0", + u8"\U0001F4B8", + u8"\U0001F412", + u8"\U0001F435", + u8"\U0001F69D", + u8"\U0001F391", + u8"\U0001F54C", + u8"\U0001F6E5", + u8"\U0001F6E3", + u8"\U0001F5FB", + u8"\U000026F0", + u8"\U0001F6B5", + u8"\U0001F6A0", + u8"\U0001F69E", + u8"\U0001F401", + u8"\U0001F42D", + u8"\U0001F444", + u8"\U0001F3A5", + u8"\U0001F5FF", + u8"\U0001F3B6", + u8"\U0001F344", + u8"\U0001F3B9", + u8"\U0001F3B5", + u8"\U0001F3BC", + u8"\U0001F485", + u8"\U0001F4DB", + u8"\U0001F3DE", + u8"\U0001F454", + u8"\U0001F18E", + u8"\U0000274E", + u8"\U0001F170", + u8"\U0001F171", + u8"\U0001F17E", + u8"\U0001F17F", + u8"\U0001F913", + u8"\U0001F610", + u8"\U0001F311", + u8"\U0001F41D", + u8"\U0001F31A", + u8"\U0001F4F0", + u8"\U0001F303", + u8"\U0001F6B3", + u8"\U000026D4", + u8"\U0001F6AB", + u8"\U0001F4F5", + u8"\U0001F51E", + u8"\U0001F6B7", + u8"\U0001F6AD", + u8"\U0001F6B1", + u8"\U00002197", + u8"\U00002196", + u8"\U0001F443", + u8"\U0001F4D3", + u8"\U0001F4D4", + u8"\U0001F529", + u8"\U0001F419", + u8"\U0001F362", + u8"\U0001F3E2", + u8"\U0001F6E2", + u8"\U0001F44C", + u8"\U0001F5DD", + u8"\U0001F474", + u8"\U0001F475", + u8"\U0001F549", + u8"\U0001F51B", + u8"\U0001F698", + u8"\U0001F68D", + u8"\U0001F694", + u8"\U0001F696", + u8"\U0001F4D6", + u8"\U0001F4D6", + u8"\U0001F4C2", + u8"\U0001F450", + u8"\U0001F513", + u8"\U0001F4ED", + u8"\U0001F4EC", + u8"\U000026CE", + u8"\U0001F4BF", + u8"\U0001F4D9", + u8"\U00002626", + u8"\U0001F4E4", + u8"\U0001F402", + u8"\U0001F4E6", + u8"\U0001F4C4", + u8"\U0001F4C3", + u8"\U0001F4DF", + u8"\U0001F334", + u8"\U0001F43C", + u8"\U0001F4CE", + u8"\U0000303D", + u8"\U0001F389", + u8"\U0001F6F3", + u8"\U0001F6C2", + u8"\U0001F43E", + u8"\U0001F43E", + u8"\U0000262E", + u8"\U0001F351", + u8"\U0001F350", + u8"\U0001F6B6", + u8"\U0000270F", + u8"\U0001F427", + u8"\U0001F614", + u8"\U0001F3AD", + u8"\U0001F623", + u8"\U0001F647", + u8"\U0001F64D", + u8"\U0001F64C", + u8"\U000026F9", + u8"\U0001F471", + u8"\U0001F64F", + u8"\U0001F4BB", + u8"\U000026CF", + u8"\U0001F416", + u8"\U0001F437", + u8"\U0001F43D", + u8"\U0001F4A9", + u8"\U0001F4A9", + u8"\U0001F4A9", + u8"\U0001F48A", + u8"\U0001F38D", + u8"\U0001F34D", + u8"\U00002653", + u8"\U0001F52B", + u8"\U0001F6D0", + u8"\U0001F0CF", + u8"\U0001F693", + u8"\U0001F6A8", + u8"\U0001F46E", + u8"\U0001F429", + u8"\U0001F37F", + u8"\U0001F4EF", + u8"\U0001F4EE", + u8"\U0001F372", + u8"\U0001F6B0", + u8"\U0001F45D", + u8"\U0001F357", + u8"\U0001F63E", + u8"\U0001F621", + u8"\U0001F4FF", + u8"\U0001F478", + u8"\U0001F5A8", + u8"\U0001F4E2", + u8"\U0001F49C", + u8"\U0001F45B", + u8"\U0001F4CC", + u8"\U0001F6AE", + u8"\U0001F407", + u8"\U0001F430", + u8"\U0001F3CE", + u8"\U0001F3CD", + u8"\U0001F4FB", + u8"\U0001F518", + u8"\U00002622", + u8"\U0001F683", + u8"\U0001F6E4", + u8"\U0001F308", + u8"\U0000270A", + u8"\U0000270B", + u8"\U0000270B", + u8"\U0001F590", + u8"\U0001F596", + u8"\U0001F40F", + u8"\U0001F400", + u8"\U0001F699", + u8"\U0001F34E", + u8"\U000000AE", + u8"\U0001F60C", + u8"\U0001F397", + u8"\U0001F6BB", + u8"\U0001F595", + u8"\U0001F49E", + u8"\U0001F380", + u8"\U0001F359", + u8"\U0001F358", + u8"\U0001F50E", + u8"\U0001F5EF", + u8"\U000021AA", + u8"\U0001F48D", + u8"\U0001F360", + u8"\U0001F916", + u8"\U0001F680", + u8"\U0001F5DE", + u8"\U0001F3A2", + u8"\U0001F413", + u8"\U0001F339", + u8"\U0001F3F5", + u8"\U0001F4CD", + u8"\U0001F6A3", + u8"\U0001F3C9", + u8"\U0001F3C3", + u8"\U0001F3C3", + u8"\U0001F3BD", + u8"\U00002650", + u8"\U000026F5", + u8"\U000026F5", + u8"\U0001F376", + u8"\U0001F4E1", + u8"\U0001F3B7", + u8"\U00002696", + u8"\U0001F3EB", + u8"\U0001F392", + u8"\U0001F982", + u8"\U0000264F", + u8"\U0001F4DC", + u8"\U0001F4BA", + u8"\U0001F648", + u8"\U0001F331", + u8"\U00002618", + u8"\U0001F367", + u8"\U0001F411", + u8"\U0001F6E1", + u8"\U000026E9", + u8"\U0001F6A2", + u8"\U0001F320", + u8"\U0001F6CD", + u8"\U0001F370", + u8"\U0001F6BF", + u8"\U0001F918", + u8"\U0001F5FE", + u8"\U0001F52F", + u8"\U0001F3BF", + u8"\U000026F7", + u8"\U0001F480", + u8"\U00002620", + u8"\U0001F6CC", + u8"\U0001F634", + u8"\U0001F4A4", + u8"\U0001F62A", + u8"\U0001F575", + u8"\U0001F355", + u8"\U0001F641", + u8"\U0001F642", + u8"\U0001F3B0", + u8"\U0001F6E9", + u8"\U0001F539", + u8"\U0001F538", + u8"\U0001F63B", + u8"\U0001F63A", + u8"\U0001F607", + u8"\U0001F60D", + u8"\U0001F608", + u8"\U0001F603", + u8"\U0001F605", + u8"\U0001F604", + u8"\U0001F606", + u8"\U0001F606", + u8"\U0001F60A", + u8"\U0001F60E", + u8"\U0001F60F", + u8"\U0001F6AC", + u8"\U0001F40C", + u8"\U0001F40D", + u8"\U0001F3D4", + u8"\U0001F3C2", + u8"\U00002744", + u8"\U00002603", + u8"\U000026BD", + u8"\U0001F366", + u8"\U0001F51C", + u8"\U00002198", + u8"\U00002199", + u8"\U0001F35D", + u8"\U00002747", + u8"\U00002728", + u8"\U0001F496", + u8"\U0001F64A", + u8"\U0001F508", + u8"\U0001F507", + u8"\U0001F509", + u8"\U0001F50A", + u8"\U0001F5E3", + u8"\U0001F4AC", + u8"\U0001F6A4", + u8"\U0001F577", + u8"\U0001F578", + u8"\U0001F5D3", + u8"\U0001F5D2", + u8"\U0001F41A", + u8"\U0001F4A6", + u8"\U0001F3C5", + u8"\U0001F433", + u8"\U0001F239", + u8"\U0001F234", + u8"\U0001F23A", + u8"\U0001F22F", + u8"\U0001F237", + u8"\U0001F236", + u8"\U0001F235", + u8"\U0001F21A", + u8"\U0001F238", + u8"\U0001F232", + u8"\U0001F233", + u8"\U0001F191", + u8"\U0001F192", + u8"\U0001F193", + u8"\U0001F194", + u8"\U0001F201", + u8"\U0001F202", + u8"\U0001F195", + u8"\U0001F196", + u8"\U0001F197", + u8"\U0001F198", + u8"\U0001F199", + u8"\U0001F19A", + u8"\U0001F3DF", + u8"\U0000262A", + u8"\U00002721", + u8"\U0001F689", + u8"\U0001F5FD", + u8"\U0001F682", + u8"\U0001F35C", + u8"\U000023F1", + u8"\U0001F4CF", + u8"\U0001F353", + u8"\U0001F399", + u8"\U000026C5", + u8"\U0001F31E", + u8"\U0001F33B", + u8"\U0001F305", + u8"\U0001F304", + u8"\U0001F307", + u8"\U0001F3C4", + u8"\U0001F363", + u8"\U0001F69F", + u8"\U0001F3CA", + u8"\U0001F54D", + u8"\U0001F489", + u8"\U0001F455", + u8"\U0001F455", + u8"\U0001F3D3", + u8"\U0001F32E", + u8"\U0001F38B", + u8"\U0001F34A", + u8"\U00002649", + u8"\U0001F695", + u8"\U0001F375", + u8"\U0001F4C6", + u8"\U0001F4DE", + u8"\U0001F52D", + u8"\U0001F4FA", + u8"\U0001F3BE", + u8"\U000026FA", + u8"\U0001F321", + u8"\U0001F914", + u8"\U0001F4AD", + u8"\U0001F5B1", + u8"\U0001F44D", + u8"\U0001F44D", + u8"\U0001F44E", + u8"\U0001F44E", + u8"\U0001F44E", + u8"\U000026C8", + u8"\U0001F3AB", + u8"\U0001F405", + u8"\U0001F42F", + u8"\U000023F2", + u8"\U0001F62B", + u8"\U0001F6BD", + u8"\U0001F5FC", + u8"\U0001F345", + u8"\U0001F445", + u8"\U0001F3A9", + u8"\U0001F51D", + u8"\U0001F5B2", + u8"\U0001F69C", + u8"\U00002122", + u8"\U0001F686", + u8"\U0001F68A", + u8"\U0001F68B", + u8"\U0001F6A9", + u8"\U0001F4D0", + u8"\U0001F531", + u8"\U0001F68E", + u8"\U0001F3C6", + u8"\U0001F379", + u8"\U0001F420", + u8"\U0001F3BA", + u8"\U0001F337", + u8"\U0001F983", + u8"\U0001F422", + u8"\U0001F500", + u8"\U0001F495", + u8"\U0001F46C", + u8"\U0001F46D", + u8"\U00002602", + u8"\U000026F1", + u8"\U0001F612", + u8"\U0001F984", + u8"\U0001F53A", + u8"\U0001F53C", + u8"\U00002195", + u8"\U0001F643", + u8"\U00002B06", + u8"\U0001F6A6", + u8"\U0001F4F3", + u8"\U0000270C", + u8"\U0001F4F9", + u8"\U0001F3AE", + u8"\U0001F4FC", + u8"\U0001F3BB", + u8"\U0000264D", + u8"\U0001F30B", + u8"\U0001F3D0", + u8"\U0001F318", + u8"\U0001F316", + u8"\U000026A0", + u8"\U0001F5D1", + u8"\U0000231A", + u8"\U0001F403", + u8"\U0001F6BE", + u8"\U0001F30A", + u8"\U0001F349", + u8"\U0001F3F4", + u8"\U0001F44B", + u8"\U0001F3F3", + u8"\U00003030", + u8"\U0001F312", + u8"\U0001F314", + u8"\U0001F314", + u8"\U0001F640", + u8"\U0001F629", + u8"\U0001F492", + u8"\U0001F3CB", + u8"\U0001F40B", + u8"\U00002638", + u8"\U0000267F", + u8"\U0001F447", + u8"\U00002755", + u8"\U0001F4AE", + u8"\U00002639", + u8"\U00002705", + u8"\U00002B1C", + u8"\U0001F448", + u8"\U000025FD", + u8"\U000025FB", + u8"\U00002B50", + u8"\U00002754", + u8"\U0001F449", + u8"\U000025AB", + u8"\U0000263A", + u8"\U0001F533", + u8"\U0001F325", + u8"\U0001F326", + u8"\U0001F324", + u8"\U0001F446", + u8"\U0000261D", + u8"\U0001F32C", + u8"\U0001F390", + u8"\U0001F377", + u8"\U0001F609", + u8"\U0001F43A", + u8"\U0001F469", + u8"\U0001F46F", + u8"\U0001F462", + u8"\U0001F45A", + u8"\U0001F452", + u8"\U0001F461", + u8"\U0001F6BA", + u8"\U0001F5FA", + u8"\U0001F61F", + u8"\U0001F381", + u8"\U0001F527", + u8"\U0000270D", + u8"\U0001F49B", + u8"\U0000262F", + u8"\U0001F910" +}; diff --git a/GhettoCryptCLI/CommandlineInterface.cpp b/GhettoCryptCLI/CommandlineInterface.cpp index 789fa6c..05bd9ad 100644 --- a/GhettoCryptCLI/CommandlineInterface.cpp +++ b/GhettoCryptCLI/CommandlineInterface.cpp @@ -63,6 +63,24 @@ void CommandlineInterface::Init(int argc, const char* const* argv) nupp.RegisterConstraint("--progress", ParamConstraint(true, DATA_TYPE::VOID, {}, false, {})); nupp.RegisterAbbreviation("-p", "--progress"); + nupp.RegisterDescription("--iobase-2", "Interpret and format ciphertexts in base2"); + nupp.RegisterConstraint("--iobase-2", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-8", "--iobase-10", "--iobase-64", "--iobase-uwu", "--iobase-emoji" })); + + nupp.RegisterDescription("--iobase-8", "Interpret and format ciphertexts in base8"); + nupp.RegisterConstraint("--iobase-8", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-2", "--iobase-10", "--iobase-64", "--iobase-uwu", "--iobase-emoji" })); + + nupp.RegisterDescription("--iobase-10", "Interpret and format ciphertexts in base10"); + nupp.RegisterConstraint("--iobase-10", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-2", "--iobase-8", "--iobase-64", "--iobase-uwu", "--iobase-emoji" })); + + nupp.RegisterDescription("--iobase-64", "Interpret and format ciphertexts in base64"); + nupp.RegisterConstraint("--iobase-64", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-2", "--iobase-8", "--iobase-10", "--iobase-uwu", "--iobase-emoji" })); + + nupp.RegisterDescription("--iobase-uwu", "Interpret and format ciphertexts in base uwu"); + nupp.RegisterConstraint("--iobase-uwu", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-2", "--iobase-8", "--iobase-10", "--iobase-64", "--iobase-emoji" })); + + nupp.RegisterDescription("--iobase-emoji", "Interpret and format ciphertexts in base emoji (EXPERIMENTAL)"); + nupp.RegisterConstraint("--iobase-emoji", ParamConstraint(true, DATA_TYPE::VOID, {}, false, { "--iobase-2", "--iobase-8", "--iobase-10", "--iobase-64", "--iobase-uwu" })); + nupp.RegisterDescription("--version", "Will supply the version of ghettocrypt used."); nupp.RegisterConstraint("--version", ParamConstraint(true, DATA_TYPE::VOID, {}, false, {})); nupp.RegisterAbbreviation("-v", "--version"); diff --git a/GhettoCryptCLI/ContainerUtility.h b/GhettoCryptCLI/ContainerUtility.h new file mode 100644 index 0000000..d289639 --- /dev/null +++ b/GhettoCryptCLI/ContainerUtility.h @@ -0,0 +1,41 @@ +#ifndef GENERALUTILITY_CONTAINERUTILITY_H +#define GENERALUTILITY_CONTAINERUTILITY_H + +#include + +namespace Leonetienne { + namespace GeneralUtility { + + class ContainerUtility { + public: + //! Will return the index of `item` in `set`. + //! \tparam T_Type The type of `item` + //! \tparam T_Container The type of container + //! \param item The item to find the index for + //! \param set The container to be looking in + //! \return The index of `item` in `set`. -1 if not found. + template + static int Ord(const T_Type& item, const T_Container& set); + + private: + // No instantiation! >:( + ContainerUtility(); + }; + + template + int ContainerUtility::Ord(const T_Type& item, const T_Container& set) { + const auto result = + std::find_if(set.begin(), set.end(), [item](const T_Type& c) -> bool { + return c == item; + }); + + // No item found + if (result == set.end()) + return -1; + else + return result - set.begin(); + } + } +} + +#endif //GENERALUTILITY_CONTAINERUTILITY_H diff --git a/GhettoCryptCLI/GhettoCryptCLI.vcxproj b/GhettoCryptCLI/GhettoCryptCLI.vcxproj index a7f60d6..db19dbe 100644 --- a/GhettoCryptCLI/GhettoCryptCLI.vcxproj +++ b/GhettoCryptCLI/GhettoCryptCLI.vcxproj @@ -149,7 +149,9 @@ + + diff --git a/GhettoCryptCLI/GhettoCryptCLI.vcxproj.filters b/GhettoCryptCLI/GhettoCryptCLI.vcxproj.filters index ec80bbc..ffe2192 100644 --- a/GhettoCryptCLI/GhettoCryptCLI.vcxproj.filters +++ b/GhettoCryptCLI/GhettoCryptCLI.vcxproj.filters @@ -35,5 +35,11 @@ Headerdateien + + Headerdateien + + + Headerdateien + \ No newline at end of file diff --git a/GhettoCryptCLI/main.cpp b/GhettoCryptCLI/main.cpp index 532b884..51ef44d 100644 --- a/GhettoCryptCLI/main.cpp +++ b/GhettoCryptCLI/main.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "CommandlineInterface.h" #include "../GhettoCrypt/Util.h" #include "../GhettoCrypt/Config.h" @@ -8,6 +10,10 @@ #include "../GhettoCrypt/Flexblock.h" #include "../GhettoCrypt/Block.h" +#include "Bases.h" +#include "BaseConversion.h" + +// Required for hidden password input #if defined _WIN32 || defined _WIN64 #include #elif defined __GNUG__ @@ -17,6 +23,29 @@ using namespace GhettoCipher; +namespace { + template + inline std::string Hex2CustomBase(const std::string& hex, const T_CONTAINER& customSet, const std::string& seperator = "") + { + std::stringstream ss; + + // Translate to custom set + const T_CONTAINER vec_base_custom = + Leonetienne::GeneralUtility::BaseConversion::BaseX_2_Y(hex, BASE_16, customSet); + + // Convert to string + for (std::size_t i = 0; i < vec_base_custom.size(); i++) + { + ss << vec_base_custom[i]; + + if (i != vec_base_custom.size() - 1) + ss << seperator; + } + + return ss.str(); + } +} + //! Will prompt a user password from stdin, hiding the input std::string PasswordPrompt() { @@ -190,10 +219,46 @@ int main(int argc, char** argv) else { // Output to stdout as a hexstring - if (shouldEncrypt) - std::cout << BitsToHexstring(output) << std::endl; - else + if (shouldEncrypt) { + + const std::string hexString = BitsToHexstring(output); + + std::string formattedCiphertext; + + // Are we using iobase 2? + if (CommandlineInterface::Get().HasParam("--iobase-2")) + // Yes: convert hex to base 2 + formattedCiphertext = Hex2CustomBase(hexString, BASE_2); + + // Are we using iobase 10? + else if (CommandlineInterface::Get().HasParam("--iobase-10")) + // Yes: convert hex to base 10 + formattedCiphertext = Hex2CustomBase(hexString, BASE_10); + + // Are we using iobase 64? + else if (CommandlineInterface::Get().HasParam("--iobase-64")) + // Yes: convert hex to base 64 + formattedCiphertext = Hex2CustomBase(hexString, BASE_64); + + // Are we using iobase uwu? + else if (CommandlineInterface::Get().HasParam("--iobase-uwu")) + // Yes: convert hex to base 64 + formattedCiphertext = Hex2CustomBase>(hexString, BASE_UWU, " "); + + // Are we using iobase emoji? + else if (CommandlineInterface::Get().HasParam("--iobase-emoji")) + // Yes: convert hex to base 64 + formattedCiphertext = Hex2CustomBase>(hexString, BASE_EMOJI); + + // Else, no special output format specified, use hex + else + formattedCiphertext = hexString; + + std::cout << formattedCiphertext << std::endl; + } + else { std::cout << BitsToString(output) << std::endl; + } } return 0;