#include #include #include #include #pragma comment(lib, "crypt32.lib") int base64_encode(const char* input, DWORD inputSize, char** output, DWORD* outputSize) { DWORD encodedSize = 0; // 初期化を行う CryptBinaryToStringA((const BYTE*)input, inputSize, CRYPT_STRING_BASE64, NULL, &encodedSize); *output = (char*)malloc(encodedSize); if (*output == NULL) { return -1; // メモリの確保に失敗 } if (!CryptBinaryToStringA((const BYTE*)input, inputSize, CRYPT_STRING_BASE64, *output, &encodedSize)) { free(*output); return -1; // エンコードに失敗 } *outputSize = encodedSize - 1; // 終端のNULL文字を除く return 0; } int base64_decode(const char* input, DWORD inputSize, BYTE** output, DWORD* outputSize) { DWORD decodedSize = 0; // 初期化を行う if (!CryptStringToBinaryA(input, inputSize, CRYPT_STRING_BASE64, NULL, &decodedSize, NULL, NULL)) { return -1; // デコードのためのサイズ取得に失敗 } *output = (BYTE*)malloc(decodedSize); if (*output == NULL) { return -1; // メモリの確保に失敗 } if (!CryptStringToBinaryA(input, inputSize, CRYPT_STRING_BASE64, *output, &decodedSize, NULL, NULL)) { free(*output); return -1; // デコードに失敗 } *outputSize = decodedSize; return 0; } int main() { const char* originalString = "Hello, World!"; DWORD originalSize = (DWORD)strlen(originalString); char* base64Encoded; DWORD base64EncodedSize; if (base64_encode(originalString, originalSize, &base64Encoded, &base64EncodedSize) == 0) { printf("Original String: %s\n", originalString); printf("Base64 Encoded: %s\n", base64Encoded); BYTE* base64Decoded; DWORD base64DecodedSize; if (base64_decode(base64Encoded, base64EncodedSize, &base64Decoded, &base64DecodedSize) == 0) { printf("Base64 Decoded: %.*s\n", base64DecodedSize, base64Decoded); free(base64Decoded); } else { printf("Base64 decoding failed.\n"); } free(base64Encoded); } else { printf("Base64 encoding failed.\n"); } return 0; }