diff --git a/misc/my_encrypt.cpp b/misc/my_encrypt.cpp index 3810fb8..462b754 100644 --- a/misc/my_encrypt.cpp +++ b/misc/my_encrypt.cpp @@ -60,8 +60,61 @@ using namespace std; sm4Encode.sm4_enc(input,strlen(input),output,szKey); } -////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////lnk20250728 +/** + * SM4 ECB 解密函数(ZeroPadding) + * @param encrypted_base64_str 加密后的 Base64 字符串 + * @param key_str 16字节密钥(明文) + * @param decrypted_output 解密后输出的字符串,需由调用者预先分配内存 + * @return 0 成功,非 0 失败 + */ +// 注意:这里使用 ZeroPadding,因此需要去除末尾 0 +int sm4_ecb_decrypt_zeropad_base64(const char* base64_cipher, const char* key_str, char* plaintext_out) { + if (!base64_cipher || !key_str || !plaintext_out) { + return -1; + } + // base64 decode + unsigned char cipher_bin[256] = {0}; + long cipher_len = 0; // 输出长度 + int ret = base64_decode(base64_cipher, strlen(base64_cipher), + (char*)cipher_bin, &cipher_len); + if (ret != 0) { + // 解码失败处理 + return -1; + } + + if (cipher_len <= 0 || cipher_len % 16 != 0) { + return -2; // SM4 块长度必须为 16 的倍数 + } + // 准备 key + if (strlen(key_str) != 16) { + return -3; // SM4 要求密钥是 16 字节 + } + + unsigned char key_bin[16] = {0}; + memcpy(key_bin, key_str, 16); + + // 初始化 SM4 解密上下文 + sm4_context ctx; + SM4 sm4; + sm4.sm4_setkey_dec(&ctx, key_bin); + + // 解密 + unsigned char plain_buf[256] = {0}; + sm4.sm4_crypt_ecb(&ctx, SM4_DECRYPT, cipher_len, cipher_bin, plain_buf); + + // 去除 zero padding(末尾的 0x00) + int plain_len = cipher_len; + while (plain_len > 0 && plain_buf[plain_len - 1] == 0x00) { + plain_len--; + } + + memcpy(plaintext_out, plain_buf, plain_len); + plaintext_out[plain_len] = '\0'; + + return 0; +} diff --git a/mms/db_interface.h b/mms/db_interface.h index ed1386d..a43008e 100644 --- a/mms/db_interface.h +++ b/mms/db_interface.h @@ -56,6 +56,8 @@ extern char* POSTGRES_TABLEPREFIX; void GetSM4Code(unsigned char* pSerise,char* pKey,char* output); void MyGetSM4Code(char* input,unsigned char* szKey,char* output); +int sm4_ecb_decrypt_zeropad_base64(const char* base64_cipher, const char* key_str, char* plaintext_out);//lnk20250728 + void try_start_kafka_thread(); void try_start_mqconsumer_thread();//lnk20241216 @@ -149,6 +151,8 @@ int parse_device_cfg_web(); int parse_model_cfg_web(); void SOEFileWeb(char* localpath,char* cloudpath,char* wavepath); const char* get_front_msg_from_subdir(); + + ////////////////////////////////////////////////////////////////////////////////////// typedef struct { char WavePhasicFlag[64]; diff --git a/mms/main.c b/mms/main.c index 1a0f4a1..1211202 100644 --- a/mms/main.c +++ b/mms/main.c @@ -218,8 +218,6 @@ int main(int argc, const char **argv) return rv; } - - getVersion(argc,argv); rv=parse_param(argc, argv); diff --git a/mms/mmsclient.c b/mms/mmsclient.c index 39999b4..2a7c569 100644 --- a/mms/mmsclient.c +++ b/mms/mmsclient.c @@ -1182,7 +1182,23 @@ S_SEC_ENCRYPT_CTRL *encryptCtrl = NULL; /* conn enctryption info */ authInfo->auth_pres = SD_TRUE; authInfo->mech_type = ACSE_AUTH_MECH_PASSWORD; memset(ied_password,0,sizeof(ied_password)); - GetSM4Code((unsigned char*)dev_series,dev_key,ied_password); + + //浼犺繘鏉ョ殑灏辨槸鍔犲瘑杩囩殑鍏堣В瀵嗘垚鏄庢枃鍐嶄紶鍏 + const char* key = "11HDESaAhiHHug2z";//涓婂眰浣跨敤鐨勫啓姝荤殑key + char dev_series_plaintext[256] = {0}; + char dev_key_plaintext[256] = {0}; + + int ret1 = sm4_ecb_decrypt_zeropad_base64(dev_series, key, dev_series_plaintext); + int ret2 = sm4_ecb_decrypt_zeropad_base64(dev_key, key, dev_key_plaintext); + if (ret1 == 0 && ret2 == 0) { + printf("璇嗗埆鐮佽В瀵嗘垚鍔焅n"); + //printf("瑙e瘑鍚庣殑 dev_series: %s\n", dev_series_plaintext); + //printf("瑙e瘑鍚庣殑 dev_key : %s\n", dev_key_plaintext); + } else { + printf("璇嗗埆鐮佽В瀵嗗け璐n"); + } + + GetSM4Code((unsigned char*)dev_series_plaintext,dev_key_plaintext,ied_password); strcpy (authInfo->u.pw_auth.password, ied_password); } else { printf("dev_series or dev_key is null or space!\n");