#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <cjson/cJSON.h>
#define BUFFER_SIZE 1024
// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, input, input_len);
SHA256_Final(hash, &sha256);
}
// 딕셔너리 정렬 함수
cJSON* sort_dict(cJSON *json)
{
cJSON *sorted = cJSON_CreateObject();
// 딕셔너리의 키를 저장할 배열 생성
const char *keys[cJSON_GetArraySize(json)];
int i = 0;
cJSON *child;
cJSON_ArrayForEach(child, json) {
keys[i] = child->string;
i++;
}
// 키를 알파벳순으로 정렬
qsort(keys, cJSON_GetArraySize(json), sizeof(const char*), strcmp);
// 정렬된 키로 딕셔너리 재구성
for (i = 0; i < cJSON_GetArraySize(json); i++) {
child = cJSON_GetObjectItemCaseSensitive(json, keys[i]);
cJSON_AddItemToObject(sorted, keys[i], cJSON_Duplicate(child, 1));
}
return sorted;
}
int main(int argc, char *argv[])
{
char buffer[BUFFER_SIZE];
size_t nread;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
// JSON 파일 열기
FILE *fp = fopen(argv[1], "r");
if (!fp) {
fprintf(stderr, "파일 열기 실패\n");
exit(1);
}
// JSON 파일 읽기
nread = fread(buffer, 1, BUFFER_SIZE, fp);
fclose(fp);
// JSON 파싱
cJSON *json = cJSON_Parse(buffer);
// 딕셔너리 정렬
cJSON *sorted_json = sort_dict(json);
// JSON 문자열로 변환
char *sorted_str = cJSON_Print(sorted_json);
// SHA256 해시값 생성
sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);
// 해시값 출력
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
printf("\n");
// 메모리 해제
cJSON_Delete(json);
cJSON_Delete(sorted_json);
free(sorted_str);
return 0;
}
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <cjson/cJSON.h>
#define BUFFER_SIZE 1024
// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, input, input_len);
SHA256_Final(hash, &sha256);
}
// 딕셔너리 정렬 함수
cJSON* sort_dict(cJSON *json)
{
cJSON *sorted = cJSON_CreateObject();
// 딕셔너리의 키를 저장할 배열 생성
const char *keys[cJSON_GetArraySize(json)];
int i = 0;
cJSON *child;
cJSON_ArrayForEach(child, json) {
keys[i] = child->string;
i++;
}
// 키를 알파벳순으로 정렬
qsort(keys, cJSON_GetArraySize(json), sizeof(const char*), strcmp);
// 정렬된 키로 딕셔너리 재구성
for (i = 0; i < cJSON_GetArraySize(json); i++) {
child = cJSON_GetObjectItemCaseSensitive(json, keys[i]);
cJSON_AddItemToObject(sorted, keys[i], cJSON_Duplicate(child, 1));
}
return sorted;
}
int main(int argc, char *argv[])
{
char buffer[BUFFER_SIZE];
size_t nread;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
// JSON 파일 열기
FILE *fp = fopen(argv[1], "r");
if (!fp) {
fprintf(stderr, "파일 열기 실패\n");
exit(1);
}
// JSON 파일 읽기
nread = fread(buffer, 1, BUFFER_SIZE, fp);
fclose(fp);
// JSON 파싱
cJSON *json = cJSON_Parse(buffer);
// 딕셔너리 정렬
cJSON *sorted_json = sort_dict(json);
// JSON 문자열로 변환
char *sorted_str = cJSON_Print(sorted_json);
// SHA256 해시값 생성
sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);
// 해시값 출력
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
printf("\n");
// 메모리 해제
cJSON_Delete(json);
cJSON_Delete(sorted_json);
free(sorted_str);
return 0;
}
//==========================================================================
위의 소스중 cJSON을 쓰지않고 json-c를 사용하는 소스
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <json-c/json.h>
#define BUFFER_SIZE 1024
// SHA256 해시값을 생성하는 함수
void sha256_hash(unsigned char *input, size_t input_len, unsigned char *hash)
{
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, input, input_len);
SHA256_Final(hash, &sha256);
}
// 딕셔너리 정렬 함수
int cmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}
json_object* sort_dict(json_object *json)
{
json_object *sorted = json_object_new_object();
// 딕셔너리의 키를 저장할 배열 생성
const char *keys[json_object_object_length(json)];
int i = 0;
json_object_object_foreach(json, key, val) {
keys[i] = key;
i++;
}
// 키를 알파벳순으로 정렬
qsort(keys, json_object_object_length(json), sizeof(const char*), cmp);
// 정렬된 키로 딕셔너리 재구성
for (i = 0; i < json_object_object_length(json); i++) {
json_object *child = json_object_object_get(json, keys[i]);
json_object_object_add(sorted, keys[i], json_object_get(child));
}
return sorted;
}
int main(int argc, char *argv[])
{
char buffer[BUFFER_SIZE];
size_t nread;
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
// JSON 파일 열기
FILE *fp = fopen(argv[1], "r");
if (!fp) {
fprintf(stderr, "파일 열기 실패\n");
exit(1);
}
// JSON 파일 읽기
nread = fread(buffer, 1, BUFFER_SIZE, fp);
fclose(fp);
// JSON 파싱
json_object *json = json_tokener_parse(buffer);
// 딕셔너리 정렬
json_object *sorted_json = sort_dict(json);
// JSON 문자열로 변환
char *sorted_str = json_object_to_json_string(sorted_json);
// SHA256 해시값 생성
sha256_hash((unsigned char*)sorted_str, strlen(sorted_str), hash);
// 해시값 출력
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
printf("\n");
// 메모리 해제
json_object_put(json);
json_object_put(sorted_json);
free(sorted_str);
return 0;
}
댓글 없음:
댓글 쓰기