Bitsetified

This commit is contained in:
Leonetienne 2021-12-05 15:58:56 +01:00
parent 523529ae97
commit 2e8c64f78d

View File

@ -1,15 +1,17 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <array> #include <array>
#include <bitset>
#define BLOCK_SIZE 8 #define BLOCK_SIZE 16
#define FEISTELBLOCK_SIZE (BLOCK_SIZE / 2)
#define N_ROUNDS 8 #define N_ROUNDS 8
std::string F(std::string m, const std::string& key); typedef std::bitset<BLOCK_SIZE> Block;
std::string Xor(const std::string& a, const std::string& b); typedef std::bitset<FEISTELBLOCK_SIZE> Feistelblock;
std::string Shiftl(const std::string& s, std::size_t amount);
std::string Shiftr(const std::string& s, std::size_t amount); Feistelblock F(Feistelblock m, const Feistelblock& key);
std::pair<std::string, std::string> Feistel(std::string l, std::string r, const std::array<std::string, 8>& keys, bool reverseKeyOrder = false); std::pair<Feistelblock, Feistelblock> Feistel(Feistelblock l, Feistelblock r, const std::array<Feistelblock, 8>& keys, bool reverseKeyOrder = false);
int Mod(int numerator, int denominator) int Mod(int numerator, int denominator)
{ {
@ -18,17 +20,17 @@ int Mod(int numerator, int denominator)
int main() int main()
{ {
std::string l = "10101010"; Feistelblock l = 0b10101010;
std::string r = "10101010"; Feistelblock r = 0b10101010;
const std::array<std::string, 8> keys = { const std::array<Feistelblock, N_ROUNDS> keys = {
"11101101", 0b11101101,
"01110101", 0b01110101,
"10111101", 0b10111101,
"00010110", 0b00010110,
"00000011", 0b00000011,
"10110011", 0b10110011,
"11011101", 0b11011101,
"00111101" 0b00111101
}; };
std::cout << "Input: " << l << r << std::endl; std::cout << "Input: " << l << r << std::endl;
@ -44,13 +46,12 @@ int main()
r = c.second; r = c.second;
std::cout << "Decrypted: " << l << r << std::endl; std::cout << "Decrypted: " << l << r << std::endl;
return 0; return 0;
} }
std::pair<std::string, std::string> Feistel(std::string l, std::string r, const std::array<std::string, 8>& keys, bool reverseKeyOrder) std::pair<Feistelblock, Feistelblock> Feistel(Feistelblock l, Feistelblock r, const std::array<Feistelblock, 8>& keys, bool reverseKeyOrder)
{ {
std::string tmp; Feistelblock tmp;
for (std::size_t i = 0; i < N_ROUNDS; i++) for (std::size_t i = 0; i < N_ROUNDS; i++)
{ {
@ -63,55 +64,20 @@ std::pair<std::string, std::string> Feistel(std::string l, std::string r, const
// Do a feistel round // Do a feistel round
tmp = r; tmp = r;
r = Xor(l, F(r, keys[keyIndex])); r = l ^ F(r, keys[keyIndex]);
l = tmp; l = tmp;
} }
return std::make_pair(r, l); return std::make_pair(r, l);
} }
std::string F(std::string m, const std::string& key) Feistelblock F(Feistelblock m, const Feistelblock& key)
{ {
// Made-up F function // Made-up F function
// Shift 5 to the left // Shift 5 to the left
m = Shiftl(m, 5); m <<= 5;
// Xor with key // Xor with key
return Xor(m, key); return m ^ key;
}
std::string Shiftl(const std::string& s, std::size_t amount)
{
std::stringstream ss;
for (std::size_t i = 0; i < s.size(); i++)
ss << s[Mod((i + amount), s.size())];
return ss.str();
}
std::string Shiftr(const std::string& s, std::size_t amount)
{
std::stringstream ss;
for (std::size_t i = 0; i < s.size(); i++)
ss << s[Mod((i - amount), s.size())];
return ss.str();
}
std::string Xor(const std::string& a, const std::string& b)
{
std::stringstream ss;
for (std::size_t i = 0; i < BLOCK_SIZE; i++)
{
if (a[i] xor b[i])
ss << '1';
else
ss << '0';
}
return ss.str();
} }