تشفير السلك الثابت
#يشمل
#يشمل
#يشمل
#يشمل
// يقوم بتشفير محتوى ملف الإدخال `arg1` ويكتب المحتوى المشفر في ملف الإخراج `arg2`.
// يتم إجراء التشفير باستخدام AES-256-CBC مع مفتاح مملح مشتق من عبارة المرور `arg3`.
// يُرجع 1 عند النجاح و0 عند الفشل.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
إذا (ملف الإدخال == NULL) {
يضع("فشل في فتح ملف الإدخال");
0 العودة؛
}
FILE *outputFile = fopen(arg2, "wb");
إذا (ملف الإخراج == NULL) {
يضع("فشل في إنشاء ملف الإخراج");
fClose(inputFile);
0 العودة؛
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
ملح شار غير موقع[8]؛
if (RAND_bytes(salt, sizeof(salt)) != 1) { // إنشاء ملح عشوائي.
يضع("فشل في توليد الملح");
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
// كتابة السلسلة السحرية "Salted__" والملح إلى ملف الإخراج.
fwrite("Salted__", 1, 8,outputFile);
fwrite(salt, 1, sizeof(salt),outputFile);
مفتاح الحرف غير الموقع[EVP_MAX_KEY_LENGTH]، iv[EVP_MAX_IV_LENGTH]؛
// اشتق المفتاح والرابع من عبارة المرور والملح باستخدام SHA-256.
إذا (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
يضع("فشل في إنشاء المفتاح");
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
إذا (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
يضع("فشلت تهيئة التشفير");
EVP_CIPHER_CTX_free(ctx);
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
unsigned char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
كثافة العمليات في لين، أووتلين؛
بينما ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
إذا (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
HandleErrors(); // حدد وظيفة معالجة الأخطاء.
// الخروج أو تنظيف الموارد.
}
fwrite(outBuf, 1, outLen,outputFile);
}
إذا (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
HandleErrors(); // التعامل مع الأخطاء بشكل مناسب.
// الخروج أو تنظيف الموارد.
}
fwrite(outBuf, 1, outLen,outputFile);
EVP_CIPHER_CTX_free(ctx);
fClose(inputFile);
fClose(outputFile);
العودة 1؛ // نجاح.
}
#يشمل
#يشمل
#يشمل
// يقوم بتشفير محتوى ملف الإدخال `arg1` ويكتب المحتوى المشفر في ملف الإخراج `arg2`.
// يتم إجراء التشفير باستخدام AES-256-CBC مع مفتاح مملح مشتق من عبارة المرور `arg3`.
// يُرجع 1 عند النجاح و0 عند الفشل.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
إذا (ملف الإدخال == NULL) {
يضع("فشل في فتح ملف الإدخال");
0 العودة؛
}
FILE *outputFile = fopen(arg2, "wb");
إذا (ملف الإخراج == NULL) {
يضع("فشل في إنشاء ملف الإخراج");
fClose(inputFile);
0 العودة؛
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
ملح شار غير موقع[8]؛
if (RAND_bytes(salt, sizeof(salt)) != 1) { // إنشاء ملح عشوائي.
يضع("فشل في توليد الملح");
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
// كتابة السلسلة السحرية "Salted__" والملح إلى ملف الإخراج.
fwrite("Salted__", 1, 8,outputFile);
fwrite(salt, 1, sizeof(salt),outputFile);
مفتاح الحرف غير الموقع[EVP_MAX_KEY_LENGTH]، iv[EVP_MAX_IV_LENGTH]؛
// اشتق المفتاح والرابع من عبارة المرور والملح باستخدام SHA-256.
إذا (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
يضع("فشل في إنشاء المفتاح");
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
إذا (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
يضع("فشلت تهيئة التشفير");
EVP_CIPHER_CTX_free(ctx);
fClose(inputFile);
fClose(outputFile);
0 العودة؛
}
unsigned char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
كثافة العمليات في لين، أووتلين؛
بينما ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
إذا (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
HandleErrors(); // حدد وظيفة معالجة الأخطاء.
// الخروج أو تنظيف الموارد.
}
fwrite(outBuf, 1, outLen,outputFile);
}
إذا (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
HandleErrors(); // التعامل مع الأخطاء بشكل مناسب.
// الخروج أو تنظيف الموارد.
}
fwrite(outBuf, 1, outLen,outputFile);
EVP_CIPHER_CTX_free(ctx);
fClose(inputFile);
fClose(outputFile);
العودة 1؛ // نجاح.
}