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;
}
任何帮助将不胜感激。
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)
Tôi là một lập trình viên xuất sắc, rất giỏi!