gpt4 book ai didi

c - Blowfish 加密和解密字符缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 11:07:19 29 4
gpt4 key购买 nike

我正在尝试让一个 bowfish 函数用于简单的字符缓冲区。当我尝试解密加密缓冲区并在 EVP_CipherFinal_ex() 调用上失败时,程序失败。

#include <string.h> 
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <openssl/blowfish.h>
#include <openssl/evp.h>

int do_crypt(unsigned char *inbuf, int inlen, unsigned char *outbuf, int *outlen, int do_encrypt) {
outbuf=(unsigned char*) malloc(inlen+EVP_MAX_BLOCK_LENGTH);
int tmplen=0;
unsigned char key[] = "0123456789";
unsigned char iv[] = "12345678";

EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, EVP_bf_cbc(), NULL, NULL, NULL, do_encrypt);
EVP_CIPHER_CTX_set_key_length(&ctx, 10);
EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt);

if(!EVP_CipherUpdate(&ctx, outbuf, outlen, inbuf, inlen)) {
/* Error */
printf("* update failed *\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}

int db=*outlen;

if(!EVP_CipherFinal_ex(&ctx, outbuf+db, &tmplen)) {
/* Error */
ERR_print_errors_fp(stderr);
printf("* finalise failed *\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}


(*outlen)=db+tmplen;

EVP_CIPHER_CTX_cleanup(&ctx);

return 1;
}
int main(int argc, char **argv) {
char *plain="ENCRYPT DECRYPT this string";
int plain_len=strlen(plain);
unsigned char *cipher;
int cipher_len;

printf("***** ENCRYPT *****\n");
if (!do_crypt((unsigned char*) plain, strlen(plain), cipher, &cipher_len, 1)) {
printf("failed to encrypt\n");
return 1;
}

char *decrypt;
int decrypt_len;
printf("***** DECRYPT *****\n");
if(!do_crypt( cipher ,cipher_len , decrypt, &decrypt_len, 0)) {
printf("failed to decrypt\n");
return 1;
}
printf("decrypt=\"%s\"\n",decrypt);
printf("decrypt_len=%d\n",decrypt_len);
return 0;
}

任何帮助将不胜感激。

最佳答案

你有两个问题:第一个是you should not cast the result of malloc in C .这是 EVP_CipherUpdate 崩溃的最可能原因。

第二个错误是 C 中的参数是按值传递的,这意味着它们被复制并且函数只有调用者传递的参数的副本。这意味着在 do_crypt 函数中,当您分配给参数 output 时,您只是将变量分配给函数内部的本地副本,即变量 cipher main 函数中的内容不会更改。

最后一个问题可以通过将指针传递给指针来模仿按引用传递,并使用寻址运算符& 和取消引用 来解决* 运算符:

/*                                     Note extra indirection */
/* | */
/* v */
int do_crypt(unsigned char *inbuf, int inlen, unsigned char **outbuf, int *outlen, int do_encrypt) {
...
*output = malloc(...);
...
if(!EVP_CipherUpdate(&ctx, *outbuf, outlen, inbuf, inlen)) { ... }
...
}

你可以这样调用它

do_crypt((unsigned char*) plain, strlen(plain), &cipher, &cipher_len, 1)

关于c - Blowfish 加密和解密字符缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717558/

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