Đây là mã cơ bản để mã hóa và giải mã tin nhắn:
#include
#include
#include
//gcc cryptage.c -o mật mã -lcrypto
int chính(){
BF_KEY *key = malloc(sizeof(BF_KEY));
unsigned char *crypt_key = "Khóa mã hóa";
const unsigned char *in = "Thư cần mã hóa";
int len = strlen(crypt_key);
unsigned char *out = malloc(sizeof(char)*len);
unsigned char *result = malloc(sizeof(char)*len);
//Xác định khóa mã hóa
BF_set_key(khóa, len, crypt_key);
//Mã hóa
BF_ecb_encrypt(vào, ra, khóa, BF_ENCRYPT);
//Giải mã
BF_ecb_encrypt(ra, kết quả, khóa, BF_DECRYPT);
fprintf(stdout,"Kết quả: %s\n",kết quả);
return 0;
}
Vấn đề của tôi là kết quả tôi nhận được. Nó luôn là một chuỗi 8 ký tự và không có gì hơn. Bạn có thể giúp tôi mã hóa và giải mã toàn bộ tin nhắn được không?
Cảm ơn!
Như @WhozCraig đã nói, xử lý 8 byte mỗi lần.
Dữ liệu được mã hóa phải được xử lý dưới dạng mảng byte thay vì chuỗi C.
Vì vậy hãy cân nhắc việc sử dụng \0
chuỗi được mã hóa và sử dụng ngẫu nhiên Dữ liệu được đệm để tạo thành một mảng byte là bội số của 8.
Mã hóa được gọi nhiều lần, mã hóa 8 byte mỗi lần lặp.
Để giải mã, hãy gọi decrypt cho cùng số lần lặp. Lưu ý rằng kích thước bộ đệm kết quả có thể cần phải là bội số của 8.
const unsigned char *in = "Thư cần mã hóa";
size_t InSize = strlen(in) + 1;
int KeyLen = strlen(crypt_key);
size_t OutSize = (InSize + 7) & (~7);
unsigned char *out = malloc(Outsize);
ký tự không dấu *outnext = out;
//Xác định khóa mã hóa
BF_set_key(khóa, KeyLen, crypt_key);
//Mã hóa
trong khi (InSize >= 8) {
BF_ecb_encrypt(in, outnext, key, BF_ENCRYPT);
trong += 8;
tiếp theo += 8;
Kích thước -= 8;
}
if (Insize > 0) { // Xử lý độ dài không phải bát phân
ký tự không dấu buf8[8];
memcpy(buf8, in, InSize);
for (i=InSize; i<8; i++) {
buf8[i] = rand();
}
BF_ecb_encrypt(buf8, outnext, key, BF_ENCRYPT);
}
//Giải mã
ký tự không dấu *result = malloc(OutSize);
ký tự không dấu *resultNext = result;
trong khi (OutSize) {
BF_ecb_encrypt(out, resultNext, key, BF_DECRYPT);
ra += 8;
resultNext += 8;
Kích thước ngoài -= 8;
}
fprintf(stdout,"Kết quả: %s\n",kết quả);
// Không cần in các byte ngẫu nhiên được tạo ra.
return 0;
}
Mã hóa một byte đã biết trong khối cuối cùng (\0
) không được thoải mái lắm. Các chỉ dẫn về độ dài khác nhau có thể cần thận trọng.
Tôi là một lập trình viên xuất sắc, rất giỏi!