Added class for hashing, that is now used for password to key transformation
This commit is contained in:
57
GCryptLib/src/Hasher.cpp
Normal file
57
GCryptLib/src/Hasher.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
#include "GCrypt/Hasher.h"
|
||||
#include "GCrypt/Util.h"
|
||||
#include "GCrypt/InitializationVector.h"
|
||||
|
||||
namespace Leonetienne::GCrypt {
|
||||
|
||||
Hasher::Hasher() :
|
||||
// Initialize our cipher with a static, but randomly distributed key.
|
||||
cipher(
|
||||
StringToBitblock("CfRtNdMTP4Y5CWRd"),
|
||||
Cipher::CIPHER_DIRECTION::ENCIPHER
|
||||
) {
|
||||
block = InitializationVector(StringToBitblock("3J7IipfQTDJbO8jtasz9PgWui6faPaEMOuVuAqyhB1S2CRcLw5caawewgDUEG1WN"));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Hasher::Digest(const Block& data) {
|
||||
// Encipher the current block, and xor it on the current hashsum
|
||||
block ^= cipher.Digest(data);
|
||||
return;
|
||||
}
|
||||
|
||||
const Block& Hasher::GetHashsum() const {
|
||||
return block;
|
||||
}
|
||||
|
||||
Block Hasher::CalculateHashsum(const Flexblock& data) {
|
||||
// Split input into blocks
|
||||
std::vector<Block> blocks;
|
||||
|
||||
for (std::size_t i = 0; i < data.size(); i += BLOCK_SIZE) {
|
||||
blocks.push_back(Block(
|
||||
PadStringToLength(data.substr(i, BLOCK_SIZE), BLOCK_SIZE, '0', false))
|
||||
);
|
||||
}
|
||||
|
||||
// Add an additional block, containing the length of the input
|
||||
std::stringstream ss;
|
||||
ss << data.length();
|
||||
const Block lengthBlock = StringToBitblock(ss.str());
|
||||
blocks.push_back(lengthBlock);
|
||||
|
||||
// Create hasher instance
|
||||
Hasher hasher;
|
||||
|
||||
// Digest all blocks
|
||||
for (Block& block : blocks) {
|
||||
hasher.Digest(block);
|
||||
}
|
||||
|
||||
// Return the total hashsum
|
||||
return hasher.GetHashsum();
|
||||
}
|
||||
|
||||
}
|
||||
|
13
GCryptLib/src/Util.cpp
Normal file
13
GCryptLib/src/Util.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "GCrypt/Util.h"
|
||||
#include "GCrypt/Hasher.h"
|
||||
|
||||
namespace Leonetienne::GCrypt {
|
||||
Block PasswordToKey(const std::string& in) {
|
||||
// We already have a hashing algorithm, so why not use it
|
||||
// Yeah, this won't work, because it would create an include loop. This method needs to be outsourced to a cpp file..
|
||||
|
||||
const Block hashedPassword = Hasher::CalculateHashsum(StringToBits(in));
|
||||
return hashedPassword;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user