gpt4 book ai didi

c - 实现 openssl evp 加密

转载 作者:行者123 更新时间:2023-11-30 16:51:03 27 4
gpt4 key购买 nike

我目前正在使用 C 中的 EVP 进行一些暴力破解一些简单文本的测试。

提供了明文、密文、 key 大小、加密方法和方法论。我们只需要尝试不同的键,即已知的字典单词。

主要问题是,如果我尝试像这样直接从 main 调用 EVP 方法:

int main(int argc, char const *argv[]) {
evp((unsigned char *)"This is a top secret.");
return 0;
}

找不到 key (无法生成相同的密码)

但是使用 clock(); 的调用称为:

int main(int argc, char const *argv[])
{
clock_t begin = clock();
evp((unsigned char *)"This is a top secret.");
return 0;
}

效果很好!为什么会发生这种情况?我究竟做错了什么?有人可以解释一下问题是什么吗?

使用aes-128-cbc加密明文,iv为16字节NULL, key 为单个字典单词,长度小于16,长度小于时补空16.

以下代码用于执行整个过程:

void evp(unsigned char * plaintext) {
FILE *fp = fopen("words.txt", "r");
const char cipher[] ="8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9";
unsigned char iv[16];
unsigned char ciphertext[256];

/**Init OpenSSL**/
ERR_load_crypto_strings();
OPENSSL_config(NULL);
OpenSSL_add_all_algorithms();

unsigned char word[17];
while(read_word(fp, word)==0) {
if(strlen((char *)word) < 16) {
add_space(word, sizeof(word));
encrypt(plaintext, strlen((char *)plaintext), word, iv, ciphertext);

if(strcmp((char *)ciphertext, cipher) == 0 ) {
printf("The key is : %s\n", word);
fclose(fp);
exit(0);
};
}
}

fclose(fp);
}

add_space 方法只是向键提供空白空间:

int add_space(unsigned char *str, size_t len) {

int eol_pos = strlen((char *)str);
int empty_space = len - eol_pos - 1 ;

//set space and eol
memset(str+eol_pos, ' ', empty_space);
memset(str+len, '\0', 0);

return 0;
}

read_word 方法从字典中读取单个单词:

int read_word(FILE *file, unsigned char * word) {
//Using fscanf
unsigned char word_buf[255];

if(fscanf(file, "%s", word_buf) != EOF) {
if( strlen( (char *)word_buf ) < 15 ) {
strcpy((char *)word,(char *) word_buf);
}
return 0;
}
return 1;
}

encrypt方法是对明文进行加密的主要过程:

void encrypt(unsigned char *plaintext, int plain_len ,unsigned char *key, unsigned char * iv, unsigned char * ciphertext) {
EVP_CIPHER_CTX *ctx;
int out_len;
int ciphertext_len;
char *buff;

if(! (ctx = EVP_CIPHER_CTX_new()) ) {
handleErrors();
}

if( EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv) != 1 )
handleErrors();

if( EVP_EncryptUpdate(ctx, ciphertext, &out_len, plaintext, plain_len ) != 1 ) {
handleErrors();
}
ciphertext_len = out_len;

if( EVP_EncryptFinal_ex(ctx, ciphertext+out_len, &out_len) != 1 ) {
handleErrors();
}
ciphertext_len += out_len;

EVP_CIPHER_CTX_cleanup(ctx);

buff = malloc(ciphertext_len*2+1);
memset(buff, 0, ciphertext_len*2+1);

for (int i = 0; i < ciphertext_len; ++i)
{
char tmp[3];
sprintf(tmp, "%02x", ciphertext[i]);
strcat(buff, tmp);
}

strcpy((char *)ciphertext, buff);
free(buff);
}

最佳答案

您实际上从未将 iv 设置为任何内容。由于 iv 是局部变量,因此其内容未初始化,随后读取它会导致未定义的行为。

当您调用clock时可能发生的情况是,该函数使用的堆栈空间可能会在堆栈上的某个位置留下一些空字节,而这些字节恰好位于iv的位置当调用加密函数时,code>将驻留。但是,您不能依赖此行为。

iv初始化为全零。然后你就会得到你期望的行为。

unsigned char iv[16] = { 0 };

关于c - 实现 openssl evp 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41917766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com