2012-01-06 14 views
6

esta es mi primera pregunta, así que por favor dígame si hago algo mal :).falta 8 bytes en EVP_DecryptFinal

Mi problema es que utilizo

EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL); 
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout, &outlf); 
printf("DECLEN:%i",outlu + outlf); 

para descifrar un archivo binario. El archivo tiene 248 bytes de longitud, pero printf solo me dice que EVP descifró 240 bytes. keysigfilelength es 248 y debe indicar a la actualización que se deben descifrar 248 bytes.

No entiendo por qué esto no funciona y sería feliz si puedes aclararme.

Editar: acabo un archivo encriptado de forma manual con el comando

openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00 

y creció un 8 bytes: S. Todavía no sé de dónde vienen, pero no creo que el error general que tengo en mi programa sea causado por esto.

El contexto de todo este problema es un curso de seguridad de la información en mi universidad. Obtuvimos Tareas similares con diferentes algoritmos, pero incluso alguien que haya realizado su programa con éxito no pudo averiguar dónde está el problema en mi programa.

¿Está bien publicar todo mi programa para usted?

+0

Solo para asegurarse, no es algo así como estar en Windows y abrir el archivo en modo texto para que '\ r's se eliminen? –

+0

http://pastebin.com/H3riQhm7 aquí hay un hexdump -C del archivo. todo el trabajo se hace en linux – outsmartin

+0

Pensé que no sería eso, pero es mejor estar seguro. –

Respuesta

2

espero que sea bien para responder a mi propia pregunta.

EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf); 

el problema fue la falta outlu, DecryptFinal intentó para descifrar todo el bloque de nuevo. Cuando agregué el o utlu obtuve 7 bytes en outlf, y funcionó. Para referencia futura añado toda la función a continuación. Se espera que la clave y iv sean un bloque de datos.

int decrypt(const EVP_CIPHER *cipher,unsigned char *key, unsigned char *encryptedData, int encryptedLength,unsigned int * length, unsigned char ** decryptedData) 
{ 
    int decryptedLength = 0, lastDecryptLength = 0, ret; 
    unsigned char * iv = NULL; 
    EVP_CIPHER_CTX *cryptCtx = EVP_CIPHER_CTX_new(); 
    EVP_CIPHER_CTX_init(cryptCtx); 
    *decryptedData = malloc (encryptedLength * sizeof(char)); 

    if(cipher->iv_len != 0) iv = key + cipher->key_len; 

    EVP_DecryptInit_ex(cryptCtx, cipher, NULL, key, iv); 
    EVP_DecryptUpdate(cryptCtx, *decryptedData, &decryptedLength, encryptedData, encryptedLength); 
    ret = EVP_DecryptFinal_ex(cryptCtx, *decryptedData + decryptedLength, &lastDecryptLength); 

    *length = decryptedLength + lastDecryptLength; 

    EVP_CIPHER_CTX_free(cryptCtx); 
    EVP_cleanup(); 
    return ret; 
} 
0

Como las cifras de bloque solo realmente quieren trabajar en una entrada que es un múltiplo de su tamaño de bloque, la entrada normalmente se rellena para cumplir este requisito. El valor por defecto para muchos programas (incluyendo openssl enc es utilizar PKCS #5 padding

Si el texto en claro que no es un múltiplo de 8 bytes se añade entonces bytes de relleno de modo que sea. Si ya es un múltiplo de 8 bytes luego 8 bytes de se añaden relleno. por lo tanto, es completamente normal que los datos cifrados a ser más largo que el texto plano.

+0

mi texto simple era de 248 bytes y aún agrega 8 bytes – outsmartin

+0

Si el texto sin formato tiene 248 bytes, se agregan 8 bytes; mi redacción no era muy clara –

Cuestiones relacionadas