cuốn sách gpt4 ai đã làm

Blowfish mã hóa và giải mã bộ đệm ký tự

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 11:07:19 29 4
mua khóa gpt4 Nike

Tôi đang cố gắng để chức năng bowfish hoạt động với bộ đệm ký tự đơn giản. Chương trình không thành công khi tôi cố giải mã bộ đệm được mã hóa và không thực hiện được lệnh gọi EVP_CipherFinal_ex().

#include  
#include
#include
#include
#include

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 tmlen=0;
khóa char không dấu [] = "0123456789";
ký tự không dấu 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)) {
/* Lỗi */
printf("* cập nhật thất bại *\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}

int db=*outlen;

if(!EVP_CipherFinal_ex(&ctx, outbuf+db, &tmlen)) {
/* Lỗi */
ERR_print_errors_fp(stderr);
printf("* hoàn thiện thất bại *\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}


(*outlen)=db+tmlen;

EVP_CIPHER_CTX_cleanup(&ctx);

return 1;
}
int main(int argc, char **argv) {
char *plain="ENCRYPT KHAI THÁC chuỗi này";
int plain_len=strlen(plain);
mật mã char * không dấu;
int cipher_len;

printf("***** MÃ HÓA *****\n");
if (!do_crypt((unsigned char*) plain, strlen(plain), cipher, &cipher_len, 1)) {
printf("mã hóa thất bại\n");
return 1;
}

char *giải mã;
int giải mã_len;
printf("**** GIẢI QUYẾT *****\n");
if(!do_crypt( cipher ,cipher_len , decrypt, &decrypt_len, 0)) {
printf("không giải mã được\n");
return 1;
}
printf("decrypt=\"%s\"\n",decrypt);
printf("decrypt_len=%d\n",decrypt_len);
return 0;
}

任何帮助将不胜感激。

câu trả lời hay nhất

bạn cóhaiCâu hỏi: Câu đầu tiên làbạn không nên bỏ kết quả của malloc trong C .Đây là Cập nhật EVP_Cipher Nguyên nhân rất có thể của vụ tai nạn.

Lỗi thứ hai là tham số trong C làtheo giá trịBị động, nghĩa là chúng được sao chép và hàm chỉ có một bản sao của các đối số được người gọi truyền vào. Điều này có nghĩa là ở do_crypt Trong một hàm, khi bạn gán cho một tham số đầu ra khi bạn chỉ gán biến cho một bản sao cục bộ bên trong hàm, tức là biến mật mã chủ yếu Nội dung bên trong hàm không thay đổi.

Vấn đề cuối cùng có thể được bắt chước bằng cách chuyển một con trỏ tớichuyển qua tham chiếuvà sử dụng toán tử địa chỉ& và sự thờ ơ để giải quyết* Người vận hành:

/* Lưu ý thêm hướng dẫn */
/* |
/*v*/
int do_crypt(unsigned char *inbuf, int inlen, unsigned char **outbuf, int *outlen, int do_encrypt) {
...
*đầu ra = malloc(...);
...
if(!EVP_CipherUpdate(&ctx, *outbuf, outlen, inbuf, inlen)) { ... }
...
}

Bạn có thể gọi nó như thế này

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

Về c - Mã hóa Blowfish và giải mã bộ đệm ký tự, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/24717558/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress