what for c openssl

c - for - openssl libraries windows



Falta 8 bytes en EVP_DecryptFinal (2)

Debido a que las cifras de bloques 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 con este requisito. El valor predeterminado para muchos programas (incluido openssl enc es usar el relleno PKCS # 5

Si el texto plano no es un múltiplo de 8 bytes, entonces se agregan los bytes de relleno para que así sea. Si ya es un múltiplo de 8 bytes, se agregan 8 bytes de relleno. Por lo tanto, es completamente normal que los datos encriptados sean más largos que el texto sin formato.

esta es mi primera pregunta, así que por favor dime si hago algo mal :).

Mi problema es que uso

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 iluminarme.

Editar: acabo de encriptar un archivo manualmente con el comando

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

y creció en 8 bytes: O. 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 mi programa completo para usted?


Espero que esté bien para responder mi propia pregunta.

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

El problema era el outlu faltante, DecryptFinal intentó descifrar todo el bloque de nuevo. Cuando agregué el outlu obtuve 7 bytes en outlf, y funcionó. Para referencia futura agrego toda la función a continuación. 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; }