펌웨어 암호화
#포함하다
#포함하다
#포함하다
#포함하다
// 입력 파일 `arg1`의 내용을 암호화하고 암호화된 내용을 출력 파일 `arg2`에 씁니다.
// 암호화는 암호 'arg256'에서 파생된 솔트 키와 함께 AES-3-CBC를 사용하여 수행됩니다.
// 성공하면 1을, 실패하면 0을 반환합니다.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
파일 *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("입력 파일을 열지 못했습니다.");
0가 돌아;
}
파일 *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("출력 파일 생성에 실패했습니다.");
fclose(입력파일);
0가 돌아;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
서명되지 않은 숯 솔트[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // 무작위 솔트를 생성합니다.
puts("솔트 생성 실패");
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
// "Salted__" 매직 스트링과 솔트를 출력 파일에 씁니다.
fwrite("소금에 절인__", 1, 8, 출력파일);
fwrite(소금, 1, sizeof(소금), 출력파일);
서명되지 않은 문자 키[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// SHA-256을 사용하여 암호 및 솔트에서 키와 IV를 파생시킵니다.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("키 생성 실패");
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("암호화 초기화 실패");
EVP_CIPHER_CTX_free(ctx);
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
unsigned char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
핸들 오류(); // 오류 처리 함수를 정의합니다.
// 리소스를 종료하거나 정리합니다.
}
fwrite(outBuf, 1, outLen, 출력파일);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
핸들 오류(); // 오류를 적절하게 처리합니다.
// 리소스를 종료하거나 정리합니다.
}
fwrite(outBuf, 1, outLen, 출력파일);
EVP_CIPHER_CTX_free(ctx);
fclose(입력파일);
fclose(출력파일);
1을 반환합니다. // 성공.
}
#포함하다
#포함하다
#포함하다
// 입력 파일 `arg1`의 내용을 암호화하고 암호화된 내용을 출력 파일 `arg2`에 씁니다.
// 암호화는 암호 'arg256'에서 파생된 솔트 키와 함께 AES-3-CBC를 사용하여 수행됩니다.
// 성공하면 1을, 실패하면 0을 반환합니다.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
파일 *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("입력 파일을 열지 못했습니다.");
0가 돌아;
}
파일 *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("출력 파일 생성에 실패했습니다.");
fclose(입력파일);
0가 돌아;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
서명되지 않은 숯 솔트[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // 무작위 솔트를 생성합니다.
puts("솔트 생성 실패");
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
// "Salted__" 매직 스트링과 솔트를 출력 파일에 씁니다.
fwrite("소금에 절인__", 1, 8, 출력파일);
fwrite(소금, 1, sizeof(소금), 출력파일);
서명되지 않은 문자 키[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// SHA-256을 사용하여 암호 및 솔트에서 키와 IV를 파생시킵니다.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("키 생성 실패");
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("암호화 초기화 실패");
EVP_CIPHER_CTX_free(ctx);
fclose(입력파일);
fclose(출력파일);
0가 돌아;
}
unsigned char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
핸들 오류(); // 오류 처리 함수를 정의합니다.
// 리소스를 종료하거나 정리합니다.
}
fwrite(outBuf, 1, outLen, 출력파일);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
핸들 오류(); // 오류를 적절하게 처리합니다.
// 리소스를 종료하거나 정리합니다.
}
fwrite(outBuf, 1, outLen, 출력파일);
EVP_CIPHER_CTX_free(ctx);
fclose(입력파일);
fclose(출력파일);
1을 반환합니다. // 성공.
}