2010-12-03 3 views
4

현재 구성 파일에서 읽는 C로 리눅스 응용 프로그램을 작성 중입니다. 이 구성 파일에는 암호화하려는 일부 데이터가 들어 있으므로 일반 텍스트가 아닙니다. 나는 이것을 연구하고 실행 가능한 해결책을 찾지 못한 채 몇 시간을 보냈다. 응용 프로그램에서 구성을 읽어야하므로 암호화하고 해독 할 수 있어야합니다. 지금까지 연구에서 정말 openSSL 암호화 라이브러리를 좋아합니다. 나는 당신이 할 수있는 명령 줄에서 알고C에서 일반 텍스트 파일 암호화하기

하려면 openssl ENC -AES-256-CBC - 소금 -에서 file.txt를 -out file.enc

사람이 내가이 작업을 수행 할 수있는 방법의 예를 제공 할 수있는 경우 C에서 가장 감사하게 생각합니다.

+0

http://www.rtfm.com/openssl-examples/ – khachik

+1

관련 파일에 대한 액세스 권한이있는 사람이라면 누구나 키 파일을 읽고 텍스트 파일의 암호를 해독 할 수 있다는 사실을 알고 계시기 바랍니다. 누가 텍스트 파일을 숨기려고합니까? 보안 모델이 손상된 것 같습니다. –

답변

4

너는 O'Reilly-Book을 봐야한다. 사물을 암호화하는 방법에 대한 몇 가지 예가 있습니다. 불행히도 대부분 네트워크 암호화입니다.

나는 책에서 예를 찾았지만 테스트 didnt는이 당신을 도울 것입니다

#include <openssl/evp.h> 

int main(int argc, char *argv[]) 
{ 
    EVP_CIPHER_CTX ctx; 
    char   key[EVP_MAX_KEY_LENGTH]; 
    char   iv[EVP_MAX_IV_LENGTH]; 
    char   *ct, *out; 
    char   final[EVP_MAX_BLOCK_LENGTH]; 
    char   str[] = "123456789abcdef"; 
    int    i; 
    if (!seed_prng()) 
    { 
    printf("Fatal Error! Unable to seed the PRNG!\n"); 
    abort(); 
    } 
    select_random_key(key, EVP_MAX_KEY_LENGTH); 
    select_random_iv(iv, EVP_MAX_IV_LENGTH); 
    EVP_EncryptInit(&ctx, EVP_bf_cbc(), key, iv); 
    ct = encrypt_example(&ctx, str, strlen(str), &i); 
    printf("Ciphertext is %d bytes.\n", i); 
    EVP_DecryptInit(&ctx, EVP_bf_cbc(), key, iv); 
    out = decrypt_example(&ctx, ct, 8); 
    printf("Decrypted: >>%s<<\n", out); 
    out = decrypt_example(&ctx, ct + 8, 8); 
    printf("Decrypted: >>%s<<\n", out); 
    if (!EVP_DecryptFinal(&ctx, final, &i)) 
    { 
    printf("Padding incorrect.\n"); 
    abort(); 
    } 
    final[i] = 0; 
    printf("Decrypted: >>%s<<\n", final); 
} 

char *encrypt_example(EVP_CIPHER_CTX *ctx, char *data, int inl, int *rb) 
{ 
    char *ret; 
    int i, tmp, ol; 
    ol = 0; 
    ret = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx)); 
    for (i = 0; i < inl/100; i++) 
    { 
    EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], 100); 
    ol += tmp; 
    } 
    if (inl % 100) 
    { 
    EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], inl%100); 
    ol += tmp; 
    } 
    EVP_EncryptFinal(ctx, &ret[ol], &tmp); 
    *rb = ol + tmp; 
    return ret; 
} 

char *decrypt_example(EVP_CIPHER_CTX *ctx, char *ct, int inl) 
{ 
    /* We're going to null-terminate the plaintext under the assumption it's 
    * non-null terminated ASCII text. The null can be ignored otherwise. 
    */ 
    char *pt = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx) + 1); 
    int ol; 
    EVP_DecryptUpdate(ctx, pt, &ol, ct, inl); 
    if (!ol) /* there's no block to decrypt */ 
    { 
    free(pt); 
    return NULL; 
    } 
    pt[ol] = 0; 
    return pt; 
} 

희망.

0

SSL 개발 패키지가 필요합니다. (libssl-dev in Ubuntu). 구현 방법에 따라 libcrypto-dev도 필요합니다.

1

이것을 확인하고 answer을 확인하고 article을 확인하십시오.

EVP_bf_cbc()EVP_aes_128_cbc() EVP_aes_192_cbc() or EVP_aes_256_cbc()으로 바꿀 수 있습니다.

0

나는 큰 O'Reilly 팬이 아니지만, this 책이 처음으로 이런 유형의 것을 시작할 때 매우 도움이된다는 것을 알았습니다.

0

왜 당신 자신을하지 않습니까? dev/random (사용자 키)에서 충분한 바이트를 읽고 구성 파일을 XOR합니다. 해독하려면 동일한 키로 다시 XOR하십시오. 이것은 간단하고 빠르며 안전합니다. 복잡한 라이브러리가 필요하지 않습니다.

+1

자신 만의 암호를 작성해서는 안됩니다. 못. 이제까지. – noqqe