2013-04-14 10 views
1

RSA 공개 키를 사용하고 AES 키를 암호화하고 해당 AES를 사용하여 HTTP를 통해 대용량 데이터를 타사 사이트로 보내려는 openssl을 사용하고 있습니다. 나는 그것이 많은 암호화를 알고, 두 번째 계층은 네트워크가 다운되었을 때, 데이터가 디스크에 캐시 되어야만한다. POST ed. 아래 인라인 덩어리있는 내가 this blog에서 예제 코드를 사용하고EVP_CIPHER_CTX에서 AES 키 받기

:

int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx) 
{ 
    int i, nrounds = 5; 
    unsigned char key[32], iv[32]; 
    /* 
    * Gen key & IV for AES 256 CBC mode. A SHA1 digest is used to hash the supplied key material. 
    * nrounds is the number of times the we hash the material. More rounds are more secure but 
    * slower. 
    */ 
    i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), salt, key_data, key_data_len, nrounds, key, iv); 
    if (i != 32) { 
    printf("Key size is %d bits - should be 256 bits\n", i); 
    return -1; 
    } 
    for(int x = 0; x<32; ++x) 
    printf("Key: %x iv: %x \n", key[x], iv[x]); 
    for(int x = 0; x<8; ++x) 
    printf("salt: %x\n", salt[x]); 
    EVP_CIPHER_CTX_init(e_ctx); 
    EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, key, iv); 
    return 0; 
} 

나는 그의 aes_init() 기능에 충실하고 싶습니다,하지만 난 할 수있는 방법을 찾을 수 없습니다 키가 초기화되면 EVP_CIPHER_CTX에서 키를 가져옵니다.

apropos 목록 EVP_CIPHER_CTX에 관한 몇 가지 기능 :

$ apropos EVP_CIPHER_CTX 
EVP_CIPHER_CTX_block_size (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_cipher (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_cleanup (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_ctrl (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_flags (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_get_app_data (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_init (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_iv_length (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_key_length (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_mode (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_nid (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_set_app_data (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_set_key_length (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_set_padding (3ssl) - EVP cipher routines 
EVP_CIPHER_CTX_type (3ssl) - EVP cipher routines 

EVP_CIPHER_CTX_set_key_length 유망 보이지만, 나는 EVP_CIPHER_CTX을 읽을 필요가있는 몇 가지 마법의 오프셋 (offset) 다음 있습니까? 그렇지 않으면, 그의 함수를 수정하여 key (및 iv)을 반환하거나 함수를 버리고 코드를 인라인해야합니다.

여기서 최종 목표는 AES를 사용하여 많은 데이터를 암호화하고 RSA 공개 키를 사용하여 AES 키를 암호화하고 두 가지 모두 base64로 인코딩 한 다음 서버에 브로드 캐스팅하는 것입니다. (나는 올바른 일을하는 방법이라고 생각합니다)

그러면 유일한 문제는 EVP_CIPHER_CTX에서 키를 추출하는 것입니다.

+0

왜 키 my repository의 전체 예제를 업로드하고 IV 키하지 않으며 IV 당신이 – doptimusprime

+0

을 찾고있는 난 그냥 일에 암호를 해독 할만큼 필요?가 다른 쪽 –

+0

나는 key_data와 소금이 필요합니까? –

답변

2

왜 이런 종류의 하이브리드 암호화에 대한 솔루션을 구축하고 싶습니까? 이미 당신을 도울 수있는 기존 표준과 방법이 있습니다.

S/MIME의 기본이되는 PKCS#7 표준을 살펴 보시기 바랍니다. OpenSSL에는 직접 인터페이스가 있습니다. 비대칭 키를 사용하여 암호화 할 데이터를 지정하고 나머지 데이터를 처리합니다. pkcs7_encryptpkcs7_decrypt에서

봐뿐만 아니라 i2d_PKCS7_* 전송 가능한 형식으로 데이터를 추출하는 방법에 대한 기능 (및 역에 대한 d2i_PKCS7_*). 이 X509하지만 d2i 부분뿐만 아니라 여기에 적용 (PKCS7_encrypt, PKCS7_decrypt 당신은 OpenSSL에 의해 사용되는 i2d/d2i convention을 숙지 할 수 있습니다

편집가 : OpenSSL이 설명서를 참조하십시오. 여기에 암호화를위한 예입니다 (암호 해독은) 유사은 :.

#include <stdio.h> 
#include <openssl/pem.h> 
#include <openssl/crypto.h> 
#include <openssl/err.h> 


int main() 
{ 
    STACK_OF(X509) *certs; 
    FILE *fp; 
    BIO *bio; 
    PKCS7 *p7; 

    ERR_load_crypto_strings(); 
    OpenSSL_add_all_algorithms(); 

    certs = sk_X509_new_null(); 
    fp = fopen("cert.pem", "r"); 
    sk_X509_push(certs, PEM_read_X509(fp, NULL, NULL, NULL)); 
    fclose(fp); 

    bio = BIO_new_file("data.txt", "r"); 
    p7 = PKCS7_encrypt(certs, bio, EVP_des_ede3_cbc(), 0); 
    BIO_free(bio); 

    bio = BIO_new_file("data.txt.enc", "w"); 
    i2d_PKCS7_bio(bio, p7); 
    BIO_flush(bio); 
    BIO_free(bio); 

    ERR_print_errors_fp(stdout); 
    return 0; 
} 

나는

+0

안녕하세요 javex, 응답 해 주셔서 감사합니다. 나는 팁을 바르게 평가한다! 나는 SMIME을 탐험했지만, 다중 게시 등의 아이디어는 내가 필요한 것에 반하는 것으로 보였다. 코드를 간소화 할 수 있다면 더 좋습니다. –

+0

RSA 공개 키를 사용하여 임의의 크기의 데이터 묶음을 암호화 한 다음 동료가 RSA를 사용하여 AES 키를 암호화하고 올바른 솔루션을 암호화했다고 가정하고이 방향으로 나아갈 것입니다. 그 열쇠로 내 데이터. 나는 표준 해결책으로 훨씬 행복 할 것이다. –

+0

그리고'der/d2i' 형식의 키를 프로젝트의 오브젝트 파일에 인라이닝하므로 이미 그 길을 따라 가고 있습니다! –