Я использую этот решенный пост в качестве ссылки, но не могу получить тот же результат: AES128 в libgcrypt не шифрует
Когда я печатаю строку в консоль, я получаю ненужные символы. Я думаю, что это может быть связано с '\0'
Находясь в последовательности, но я не уверен, как это сделать.
//aes.cpp
#include "aes.h"#include <iostream>
#include <stdio.h>
#define GCRY_CIPHER GCRY_CIPHER_AES128 // Pick the cipher here
#define GCRY_MODE GCRY_CIPHER_MODE_ECB // Pick the cipher mode here
aes::aes(std::string k)
{
key_ = k;
keyLength_ = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_MODE, 0);
gcry_cipher_setkey(handle, key_.c_str(), keyLength_);
}
void aes::encrypt(string text, std::vector<char>& ret) {
size_t textLength = text.size() + 1;
ret.resize(textLength);
gcry_cipher_encrypt(handle, ret.data(), textLength, text.c_str(), textLength);
}
string aes::decrypt(std::vector<char> const& text) {
size_t textLength = text.size() + 1;char * decBuffer = new char[textLength];
gcry_cipher_decrypt(handle, decBuffer, textLength, text.data(), textLength);
string ret (decBuffer);
delete [] decBuffer;
return ret;
}
//aes.h
#include <gcrypt.h>
#include <iostream>
#ifndef AES_H
#define AES_H
class aes
{
public:
aes(std::string);
~aes();
gcry_cipher_hd_t handle;
void encrypt(std::string, std::vector<char>&);
std::string decrypt(std::vector<char> const&);
private:
std::string key_;
size_t keyLength_;
};
#endif // AES_H
//main.cpp
#include "aes.h"#include <iostream>
int main()
{
std::vector<char> data;
aes bb = aes("one test AES key");
bb.encrypt("Some message", data);
std::string dec = bb.decrypt(data);
std::cout << "decrypted string " << dec << std::endl;
return 0;
//output gives me: decrypted string �
}
Для AES128 в режиме ECB размер зашифрованных данных должен быть кратным 128 битам. Размеры открытого и зашифрованного текста должны быть одинаковыми.
Вот рабочий код, чтобы дать вам представление о том, что вам нужно сделать, чтобы он работал. Но я настоятельно рекомендую вам переосмыслить использование ЕЦБ.
#include <gcrypt.h>
#include <iostream>
#include <vector>
#include <stdio.h>
class aes
{
public:
aes(std::string);
~aes() { ; }
gcry_cipher_hd_t handle;
void encrypt(std::string, std::vector<char>&);
std::string decrypt(std::vector<char> const&);
private:
std::string key_;
size_t keyLength_;
};
#define GCRY_CIPHER GCRY_CIPHER_AES128
#define GCRY_MODE GCRY_CIPHER_MODE_ECB
aes::aes(std::string k)
{
key_ = k;
keyLength_ = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_MODE, 0);
gcry_cipher_setkey(handle, key_.c_str(), keyLength_);
}
void aes::encrypt(std::string text, std::vector<char>& ret)
{
// round up to the nearest multiple of the AES block size
while ((text.size() & 0xf) != 0xf)
text += " ";
size_t textLength = text.size() + 1;
ret.resize(textLength);
int err = gcry_cipher_encrypt(handle, ret.data(), textLength, text.c_str(), textLength);
if (err != 0)
{
std::cout << "encrypt fail" <<
gcry_strsource(err) << " " <<
gcry_strerror(err) << std::endl;
}
}
std::string aes::decrypt(std::vector<char> const& text) {
size_t textLength = text.size();
char * decBuffer = new char[textLength];
int err=gcry_cipher_decrypt(handle, decBuffer, textLength, text.data(), textLength);
if (err != 0)
{
std::cout << "decrypt fail: " <<
gcry_strsource(err) << " " <<
gcry_strerror(err) << std::endl;
}
std::string ret (decBuffer);
delete [] decBuffer;
return ret;
}
int main()
{
std::vector<char> data;
aes bb = aes("one test AES key");
bb.encrypt("Some message", data);std::string dec = bb.decrypt(data);
std::cout << "decrypted string " << dec << std::endl;
return 0;
}
расшифрованная строка Некоторое сообщение
Других решений пока нет …