Deszyfracja została skończona i działa poprawnie
This commit is contained in:
parent
c234825ac5
commit
55c273eace
8 changed files with 104 additions and 20 deletions
|
|
@ -21,9 +21,8 @@ std::vector<char> EncryptionManager::encrypt(const std::vector<char>& raw)
|
|||
reinterpret_cast<unsigned char*>(crypt.data()),
|
||||
reinterpret_cast<const unsigned char*>(raw.data()),
|
||||
static_cast<unsigned long long>(raw.size()),
|
||||
nonce.data(),
|
||||
0,
|
||||
key.data()) != 0) {
|
||||
nonce.data(), 0, key.data()) != 0)
|
||||
{
|
||||
throw std::runtime_error("crypto_stream_chacha20_ietf_xor_ic failed");
|
||||
}
|
||||
|
||||
|
|
@ -52,11 +51,17 @@ void EncryptionManager::saveKey(const std::string& path)
|
|||
|
||||
// Wygeneruj time stamp
|
||||
std::time_t now = std::time(nullptr);
|
||||
const uint32_t time = static_cast<uint32_t>(now);
|
||||
const int time = static_cast<int>(now);
|
||||
|
||||
// Wygeneruj crc kluczy
|
||||
const uint64_t crcKey = XXH64(key.data(), key.size(), 0);
|
||||
const uint64_t crcNonce = XXH64(nonce.data(), nonce.size(), 0);
|
||||
std::vector<char> keyVec(reinterpret_cast<const char*>(key.data()),
|
||||
reinterpret_cast<const char*>(key.data()) + key.size());
|
||||
|
||||
std::vector<char> nonceVec(reinterpret_cast<const char*>(nonce.data()),
|
||||
reinterpret_cast<const char*>(nonce.data()) + nonce.size());
|
||||
|
||||
const uint64_t crcKey = XXH64(keyVec.data(), keyVec.size(), VERSION);
|
||||
const uint64_t crcNonce = XXH64(nonceVec.data(), nonceVec.size(), VERSION);
|
||||
|
||||
// Zapisz ten œmietnik do pliku KEY
|
||||
std::ofstream file(path + ".key", std::ios::binary);
|
||||
|
|
@ -65,16 +70,16 @@ void EncryptionManager::saveKey(const std::string& path)
|
|||
file.write(reinterpret_cast<const char*>(&sig), sizeof(sig));
|
||||
file.write(reinterpret_cast<const char*>(&ver), sizeof(ver));
|
||||
file.write(reinterpret_cast<const char*>(&time), sizeof(time));
|
||||
file.write(reinterpret_cast<const char*>(key.data()), key.size());
|
||||
file.write(reinterpret_cast<const char*>(keyVec.data()), keyVec.size());
|
||||
file.write(reinterpret_cast<const char*>(&crcKey), sizeof(crcKey));
|
||||
file.write(reinterpret_cast<const char*>(nonce.data()), nonce.size());
|
||||
file.write(reinterpret_cast<const char*>(nonceVec.data()), nonceVec.size());
|
||||
file.write(reinterpret_cast<const char*>(&crcNonce), sizeof(crcNonce));
|
||||
|
||||
if (!file.good()) { std::cout << "Dupa nie zapisa³o" << std::endl; }
|
||||
|
||||
file.close();
|
||||
|
||||
saveCppHeadFile(path);
|
||||
//saveCppHeadFile(path);
|
||||
}
|
||||
|
||||
// Generowanie pliku nag³ówkowego CPP z kluczem i nonce
|
||||
|
|
@ -90,7 +95,7 @@ void EncryptionManager::saveCppHeadFile(const std::string& path)
|
|||
"// Ci¹g nonce\n"
|
||||
"const std::array<unsigned char, crypto_stream_chacha20_ietf_NONCEBYTES> nonce{" + toHex(nonceVec) + "}; ";
|
||||
|
||||
std::ofstream file(path + ".hpp");
|
||||
std::ofstream file(path + ".hh");
|
||||
file << headerText;
|
||||
file.close();
|
||||
}
|
||||
|
|
@ -124,5 +129,63 @@ std::string EncryptionManager::toHex(const std::vector<unsigned char>& data)
|
|||
// Wczytaj klucz
|
||||
void EncryptionManager::loadKey(const std::string& path)
|
||||
{
|
||||
std::cout << "ODCZYT KLUCZA" << std::endl;
|
||||
std::ifstream file(path + ".key", std::ios::binary);
|
||||
|
||||
int sig;
|
||||
short ver;
|
||||
int time;
|
||||
|
||||
// Wczytaj
|
||||
file.read(reinterpret_cast<char*>(&sig), sizeof(sig));
|
||||
file.read(reinterpret_cast<char*>(&ver), sizeof(ver));
|
||||
|
||||
// SprawdŸ czy plik klucza jest poprawny
|
||||
if (sig != SIGNATURE_KEY_FILE || ver != VERSION)
|
||||
{
|
||||
throw std::runtime_error("Invalid key file!");
|
||||
}
|
||||
|
||||
std::vector<char> keyVec(key.size());
|
||||
std::vector<char> nonceVec(nonce.size());
|
||||
uint64_t crcKey;
|
||||
uint64_t crcNonce;
|
||||
|
||||
file.read(reinterpret_cast<char*>(&time), sizeof(time));
|
||||
file.read(keyVec.data(), keyVec.size());
|
||||
file.read(reinterpret_cast<char*>(&crcKey), sizeof(crcKey));
|
||||
file.read(nonceVec.data(), nonceVec.size());
|
||||
file.read(reinterpret_cast<char*>(&crcNonce), sizeof(crcNonce));
|
||||
|
||||
std::cout << crcKey << " - " << XXH64(keyVec.data(), keyVec.size(), VERSION) << std::endl;
|
||||
|
||||
// SprawdŸ integralnoœæ klucza
|
||||
if (XXH64(keyVec.data(), keyVec.size(), VERSION) != crcKey
|
||||
|| XXH64(nonceVec.data(), nonceVec.size(), VERSION) != crcNonce)
|
||||
{
|
||||
throw std::runtime_error("Key integrity error!");
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
// Przekonwertuj vector na array
|
||||
key = toArray<crypto_stream_chacha20_ietf_KEYBYTES>(keyVec);
|
||||
nonce = toArray<crypto_stream_chacha20_ietf_NONCEBYTES>(nonceVec);
|
||||
}
|
||||
|
||||
// Deszyfracja
|
||||
std::vector<char> EncryptionManager::decrypt(const std::vector<char>& crypt)
|
||||
{
|
||||
std::vector<char> raw(crypt.size());
|
||||
|
||||
if (crypto_stream_chacha20_ietf_xor(
|
||||
reinterpret_cast<unsigned char*>(raw.data()),
|
||||
reinterpret_cast<const unsigned char*>(crypt.data()),
|
||||
static_cast<unsigned long long>(crypt.size()),
|
||||
nonce.data(), key.data()) != 0)
|
||||
{
|
||||
throw std::runtime_error("Data decryption error!");
|
||||
}
|
||||
|
||||
return raw;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue