TL;博士...
我需要使用 OpenSSL / EVP RC4 流密码逐字节加密内存中的 C 结构。如何实现 EVP(例如 EVP_CipherUpdate)来完成结构中字节的实际加密?
细节...
我有一个 ISAM/BTree 数据库,需要对其记录/数据进行加密。不用担心,只要知道每个“记录”都是一个具有许多成员(字段)的 C 结构。这已经工作了 15 年(不要问,我认为代码库来自 K&R C 时代)。ISAM 开销只是在写入记录时将字节流(带数据的结构)作为参数......具体来说,ISAM 的“写入”函数接受指向数据/结构的指针。
无论如何,我正在尝试通过 EVP 框架实现一个 OpenSSL 流密码 (RC4),它可以位于我的程序和 ISAM 之间,以便简单地将我的加密字节交给 ISAM,而无需他知道或关心。我可能会补充一点,我认为 ISAM 并不关心数据的结构,甚至不关心它是一个结构......我相信它只是获取原始数据。
我的结构就像这个简化的例子(实际上有更多不同的成员):
typedef struct
UCHAR flag;
char field2[30];
int qty;
} DB_REC;
如有必要,我将如何(如果可能的话)对整个结构(就地,甚至)进行逐字节加密?我什至尝试过使用简单的字符串进行测试;但也无法让它发挥作用。
我有另一个名为crypto.c(和.h)的文件,我正在构建我的函数来加密和解密我“传递”给他们的任何东西(可能是一个字符串,一个结构,无论什么 - 这就是我的arg无效的原因)。例如:
void encrypt_db_rawData(void *data_to_encrypt, size_t data_size)
{
unsigned char buf_out[data_size];
int buf_out_byteCount = 0;
buf_out_byteCount = sizeof(buf_out);
EVP_CIPHER_CTX ctx; //declare an EVP context
int keyBytes = 16; //size of RC4 key in bytes
/* ... my_keystr is acquired from a file elsewhere ... */
/* ... my_iv is a global defined elsewhere ... */
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, NULL, NULL, 1);
EVP_CIPHER_CTX_set_key_length(&ctx, keyBytes);
EVP_CipherInit_ex(&ctx, NULL, NULL, my_keystr, my_iv, 1);
int byte_i;
for( byte_i = 0; byte_i < sizeof(data_to_encrypt); i++ )
{
EVP_CipherUpdate(&ctx, buf_out, &buf_out_byteCount, data_to_encrypt[byte_i], 1);
}
*data_to_encrypt = buf_out; //overwrite the original data with its encrypted version
}
C 不是我的第一语言~ 尤其是 C89(或者更老的语言),而且我在这方面有点过头了——由于一些重组,它被抛到了我的腿上;因此,我感谢任何人可以提供的任何建设性帮助。我在指针地狱!