前提条件:
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.我是写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这里。然后就结束了,如下图:
