From 2b8203c76d3f2b8e4e9e347113331b2ed44139c2 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sun, 5 Dec 2021 16:15:11 +0100 Subject: [PATCH] Cleanup --- main.cpp | 60 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/main.cpp b/main.cpp index e6b8f9c..63fe62a 100644 --- a/main.cpp +++ b/main.cpp @@ -10,18 +10,24 @@ typedef std::bitset Block; typedef std::bitset Feistelblock; -Feistelblock F(Feistelblock m, const Feistelblock& key); -std::pair Feistel(Feistelblock l, Feistelblock r, const std::array& keys, bool reverseKeyOrder = false); -int Mod(int numerator, int denominator) -{ - return (denominator + (numerator % denominator)) % denominator; -} + +// Split a data block into two feistel blocks (into L and R) +std::pair FeistelSplit(const Block& block); + +// Combine two feistel blocks (L and R) into a regular data block +Block FeistelCombine(const Feistelblock& l, const Feistelblock& r); + +// Feistel-cipher +Block Feistel(const Block& data, const std::array& keys, bool reverseKeyOrder = false); + +// Arbitrary cipher function +Feistelblock F(Feistelblock m, const Feistelblock& key); int main() { - Feistelblock l = 0b10101010; - Feistelblock r = 0b10101010; + Block message = 0b1010101010101010; + const std::array keys = { 0b11101101, 0b01110101, @@ -33,24 +39,23 @@ int main() 0b00111101 }; - std::cout << "Input: " << l << r << std::endl; + std::cout << "Input: " << message << std::endl; - auto c = Feistel(l, r, keys); - l = c.first; - r = c.second; + Block ciphertext = Feistel(message, keys); + std::cout << "Ciphertext: " << ciphertext << std::endl; - std::cout << "Ciphertext: " << l << r << std::endl; + Block decrypted = Feistel(ciphertext, keys, true); + std::cout << "Decrypted: " << decrypted << std::endl; - c = Feistel(l, r, keys, true); - l = c.first; - r = c.second; - - std::cout << "Decrypted: " << l << r << std::endl; return 0; } -std::pair Feistel(Feistelblock l, Feistelblock r, const std::array& keys, bool reverseKeyOrder) +Block Feistel(const Block& data, const std::array& keys, bool reverseKeyOrder) { + const auto splitData = FeistelSplit(data); + Feistelblock l = splitData.first; + Feistelblock r = splitData.second; + Feistelblock tmp; for (std::size_t i = 0; i < N_ROUNDS; i++) @@ -68,7 +73,7 @@ std::pair Feistel(Feistelblock l, Feistelblock r, co l = tmp; } - return std::make_pair(r, l); + return FeistelCombine(r, l); } Feistelblock F(Feistelblock m, const Feistelblock& key) @@ -81,3 +86,18 @@ Feistelblock F(Feistelblock m, const Feistelblock& key) // Xor with key return m ^ key; } + +std::pair FeistelSplit(const Block& block) +{ + const std::string bits = block.to_string(); + + Feistelblock l(bits.substr(0, bits.size() / 2)); + Feistelblock r(bits.substr(bits.size() / 2)); + + return std::make_pair(l, r); +} + +Block FeistelCombine(const Feistelblock& l, const Feistelblock& r) +{ + return Block(l.to_string() + r.to_string()); +}