酷酷杰伦😈 酷酷杰伦
关注数: 2 粉丝数: 61 发帖数: 4,292 关注贴吧数: 84
【萌新请教】 前提条件: 1.我是写java的。c一窍不通 2.我使用dev-c++ 5.11这个ide希望测试个c的程序 3.程序中使用到了openssl,我本地已经安装了openssl 4.程序代码如下 #include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/evp.h> #include <openssl/sha.h> #include <openssl/bio.h> #include <openssl/buffer.h> #include <openssl/pem.h> // 对appSecrt进行哈希得到key void hashAppSecret(const char *appSecrt, unsigned char *keyBs) { SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, appSecrt, strlen(appSecrt)); SHA256_Final(keyBs, &sha256); } // 解码Base64字符串 int base64Decode(const char *encoded, unsigned char **decoded) { BIO *bio, *b64; int decodedSize = 0; int len = strlen(encoded); b64 = BIO_new(BIO_f_base64()); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); bio = BIO_new_mem_buf(encoded, len); bio = BIO_push(b64, bio); *decoded = (unsigned char *)malloc(len); decodedSize = BIO_read(bio, *decoded, len); BIO_free_all(bio); return decodedSize; } // 解密数据 char *decrypt(const unsigned char *keyBs, const unsigned char *encryptedData, int encryptedDataSize) { AES_KEY aesKey; unsigned char iv[16]; memcpy(iv, encryptedData, 16); if (AES_set_decrypt_key(keyBs, 256, &aesKey) < 0) { fprintf(stderr, "AES key setup failed\n"); return NULL; } int paddedDataSize = encryptedDataSize - 16; unsigned char *paddedData = (unsigned char *)malloc(paddedDataSize); if (paddedData == NULL) { fprintf(stderr, "Memory allocation failed\n"); return NULL; } memcpy(paddedData, encryptedData + 16, paddedDataSize); unsigned char *decryptedData = (unsigned char *)malloc(paddedDataSize); if (decryptedData == NULL) { fprintf(stderr, "Memory allocation failed\n"); free(paddedData); return NULL; } AES_cbc_encrypt(paddedData, decryptedData, paddedDataSize, &aesKey, iv, AES_DECRYPT); free(paddedData); // 去除尾部的填充 int padding = decryptedData[paddedDataSize - 1]; if (padding > 0 && padding <= 16) { paddedDataSize -= padding; } char *result = (char *)malloc(paddedDataSize + 1); if (result == NULL) { fprintf(stderr, "Memory allocation failed\n"); free(decryptedData); return NULL; } memcpy(result, decryptedData, paddedDataSize); result[paddedDataSize] = '\0'; free(decryptedData); return result; } int main() { printf("11111111111111111111111111111111111111111\n"); const char *appSecret = "12345678901234567890123456789012"; const char *encryptedData = "aKXYP+C3562MZOZ4sHcji3zH3XQJvzZQHA2h1/+XmuYVTTf3PXa7Hrwn11/8ujLptt1CRmDbn8AJ/qZ3OLD427cxywuWtIXojBQwtcxwP5Nin5a8BDbVDtTMh4eFVqD9XxgGlAwkuIqhIHda+OpeDdABA34g++DKck5Z7erHcinnTsxIGaXnMrx5ngAZnmctOC4FINEOS58vQc6HFWI8iJN85eS9vpvu3sxHXh2066yugdDfYn7Wi55b9ZWXisHHotMXk9RuRhBU5cjdReBMyg8AHR/F0zIByjhaIfZWJw4+GdJr/TmHac5Lx1aSJsLYRbrnb4+Hi5go6Uv9bU2sSTTIJEW+9HgDFvnaLELGxstBOFz6sTFopfEk/IyFp6PTpl2XTpYFC5od88RpwPmPAERmbYZzDE+VPLsJ67nh+L6eubzML7knxa+1EZGk8Vo7Id/nGjOn6JvVnTSCQY+D3gI50phVKKBB5wTapBWbeG9R/aWJyvC8m/M4Sv0xVfPCSnoUENBE0+KIjI5/OlieGmBoTfPJ2kgv9MYoqJu8EXFSfplMkxyp+SC1RQ1EC/+Y6nJZTzoUqjo2o1+3vGNeYb8bjgiePACtTTl7fCXWxAzEovZon6LIGy2ddVWojBxD"; unsigned char keyBs[32]; hashAppSecret(appSecret, keyBs); printf("454444444444444444444444444444444444\n"); unsigned char *decodedData = NULL; int decodedSize = base64Decode(encryptedData, &decodedData); printf("decodedSize\n"); if (decodedData == NULL || decodedSize <= 0) { fprintf(stderr, "Base64 decoding failed\n"); return 1; } printf("base64 Text: %s\n", decodedData); char *decryptedText = decrypt(keyBs, decodedData, decodedSize); free(decodedData); printf("22222222222222222222222222222222222222222222222222222\n"); if (decryptedText != NULL) { printf("Decrypted Text: %s\n", decryptedText); free(decryptedText); } else { fprintf(stderr, "Decryption failed\n"); return 1; } printf("333333333333333333333333333333333333333333333333333333\n"); return 0; } 5.我遇到的问题:发给别人别人可以正常执行,最终输出解密后的内容,我执行后发现程序只能打印1111111这里。然后就结束了,如下图:
1 下一页