当前位置: 首页 > news >正文

mbedtls加密组件使用示例

1 mbedtls aes组件的使用

1.1 AES ECB加解密接口使用

int main(int argc, char *argv[])
{char key[256];char *inbuf = calloc(1, 257);char *outbuf = calloc(1, 257);char *buf = calloc(1,257);char *tmp_outbuf = outbuf;char *tmp_buf = buf;mbedtls_aes_context aes_ctx;mbedtls_aes_init(&aes_ctx);for (int i = 0; i < 256;i++){inbuf[i] = '0' + i % 16;}printf("\n inbuf = %s\n",inbuf);memset(key, 0x55, 256);mbedtls_aes_setkey_enc(&aes_ctx, key, 128);for (int i = 0; i < 16;i++){mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, inbuf, tmp_outbuf);inbuf += 16;tmp_outbuf += 16;}mbedtls_aes_setkey_dec(&aes_ctx, key, 128);tmp_outbuf = outbuf;for (int i = 0; i < 16; i++){mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT, tmp_outbuf, tmp_buf);tmp_outbuf += 16;tmp_buf += 16;}mbedtls_aes_free(&aes_ctx);printf("\n buf = %s\n",buf);getchar();
}

1.2 AEC CBC加解密接口使用

	int olen;					//编码后长度char encrypt_buf[512] = { 0 };//用于加密后存放字符串int encrypt_len;			//加密后长度char buf[512] = "abcdefg42t432876482364623874623846283ywadasdhiatdawdagdawidqhawiyweheyuw9r";	//初始化字符串char secretKey[128] = {1,2,3};int len = (strlen(buf) / 16 ) * 16;mbedtls_aes_context ctx;mbedtls_aes_init(&ctx);		//初始化结构体mbedtls_aes_setkey_enc(&ctx, secretKey, 128);	//密码(密钥)char iv[16] = { 0 };mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, len, iv, buf, encrypt_buf);	//第三个参数为文档中的偏移量memset(buf,0,sizeof(buf));memset(iv,0,sizeof(iv));mbedtls_aes_setkey_dec(&ctx, secretKey, 128);mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, len, iv, encrypt_buf, buf);	//第三个参数为文档中的偏移量printf("\nbuf = %s\n",buf);mbedtls_aes_free(&ctx);

1.3 AES 使用CFB加解密接口使用

int main(int argc, char *argv[])
{int olen;					//编码后长度char encrypt_buf[512] = { 0 };//用于加密后存放字符串int encrypt_len;			//加密后长度char buf[512] = "234abcdefg42t432876482364623874623846283ywadasdhiatdawdagdawidqhawiyweheyuwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv9r";	//初始化字符串char secretKey[128] = {1,2,3};int len = 129;printf("\n len = %d\n",len);mbedtls_aes_context ctx;mbedtls_aes_init(&ctx);		//初始化结构体mbedtls_aes_setkey_enc(&ctx, secretKey, 128);	//密码(密钥)char iv[16] = { 0 };size_t iv_off = 1;int ret = mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, len, &iv_off,iv, buf, encrypt_buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n",ret);memset(buf,0,sizeof(buf));memset(iv,0,sizeof(iv));printf("\n iv_off = %d\n",iv_off);iv_off = 1;//mbedtls_aes_setkey_dec(&ctx, secretKey, 128);mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, len, &iv_off,iv, encrypt_buf, buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n", ret);printf("\nbuf = %s\n",buf);mbedtls_aes_free(&ctx);getchar();
}

1.4 AES 使用OFB加解密接口使用

int main(int argc, char *argv[])
{int olen;					//编码后长度char encrypt_buf[512] = { 0 };//用于加密后存放字符串int encrypt_len;			//加密后长度char buf[512] = "234abcdefg42t432876482364623874623846283ywadasdhiatdawdagdawidqhawiyweheyuwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv9r";	//初始化字符串char secretKey[128] = {1,2,3};int len = 129;printf("\n len = %d\n",len);mbedtls_aes_context ctx;mbedtls_aes_init(&ctx);		//初始化结构体mbedtls_aes_setkey_enc(&ctx, secretKey, 128);	//密码(密钥)char iv[16] = { 0 };size_t iv_off = 1;int ret = mbedtls_aes_crypt_ofb(&ctx, len, &iv_off,iv, buf, encrypt_buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n",ret);memset(buf,0,sizeof(buf));memset(iv,0,sizeof(iv));printf("\n iv_off = %d\n",iv_off);iv_off = 1;//mbedtls_aes_setkey_dec(&ctx, secretKey, 128);mbedtls_aes_crypt_ofb(&ctx,  len, &iv_off,iv, encrypt_buf, buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n", ret);printf("\nbuf = %s\n",buf);mbedtls_aes_free(&ctx);getchar();
}

1.5 AES 使用CTR加解密接口使用

int main(int argc, char *argv[])
{int olen;					//编码后长度char encrypt_buf[512] = { 0 };//用于加密后存放字符串int encrypt_len;			//加密后长度char buf[512] = "234abcdefg42t432876482364623874623846283ywadasdhiatdawdagdawidqhawiyweheyuwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwfvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv9r";	//初始化字符串char secretKey[128] = {1,2,3};int len = 129;printf("\n len = %d\n",len);mbedtls_aes_context ctx;mbedtls_aes_init(&ctx);		//初始化结构体mbedtls_aes_setkey_enc(&ctx, secretKey, 128);	//密码(密钥)char iv[16] = { 0 };size_t nc_off = 0;unsigned char nonce_counter[16] = {0};unsigned char stream_block[16] = {0};int ret = mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, nonce_counter, stream_block, buf, encrypt_buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n",ret);memset(buf,0,sizeof(buf));memset(iv,0,sizeof(iv));memset(nonce_counter, 0, sizeof(nonce_counter));memset(stream_block, 0, sizeof(stream_block));printf("\n nc_off = %d\n",nc_off);nc_off = 0;//mbedtls_aes_setkey_dec(&ctx, secretKey, 128);ret = mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, nonce_counter, stream_block, encrypt_buf, buf);	//第三个参数为文档中的偏移量printf("\n ret = %d\n", ret);printf("\nbuf = %s\n",buf);mbedtls_aes_free(&ctx);getchar();
}

1.6 AES 使用PKCS7Padding填充方式加密

int main(int argc, char *argv[])
{unsigned char key[17] = "123456778";unsigned char iv[17] = {0};unsigned char output[1024];unsigned char output1[1024];size_t olen;size_t total_len = 0;mbedtls_cipher_context_t ctx;mbedtls_cipher_init(&ctx);mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setup(&ctx,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_setkey(&ctx, key, 128, MBEDTLS_ENCRYPT);mbedtls_cipher_set_iv(&ctx, iv, 16);mbedtls_cipher_reset(&ctx);char aa[500] = "1234567ytruwieyriuyweioruoiweufowusfhsdfhsdlfjwyoqyfa8";printf("\n aa len  = %d \n",strlen(aa));mbedtls_cipher_update(&ctx, aa, strlen(aa), output, &olen);printf("\nolen = %d\n", olen);int inlen = olen;mbedtls_cipher_finish(&ctx, output + olen, &olen);inlen += olen;memcpy(output1 , output, inlen);printf("\nolen = %d\n", olen);printf("\n inlen = %d\n", inlen);mbedtls_cipher_free(&ctx);mbedtls_cipher_context_t ctx1;mbedtls_cipher_init(&ctx1);mbedtls_cipher_set_padding_mode(&ctx1, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setup(&ctx1,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_setkey(&ctx1, key, 128, MBEDTLS_DECRYPT);memset(iv, 0, sizeof(iv));mbedtls_cipher_set_iv(&ctx1, iv, 16);mbedtls_cipher_reset(&ctx1);int OLEN1 = 0;memset(aa,0,sizeof(aa));mbedtls_cipher_update(&ctx1, output1, inlen, aa, &OLEN1);total_len = OLEN1;mbedtls_cipher_finish(&ctx1, aa + OLEN1, &OLEN1);total_len += OLEN1;aa[total_len] = 0;printf("\n aa = %s \n", aa);mbedtls_cipher_free(&ctx1);getchar();
}

1.7 AES 使用PKCS5Padding填充方式加密

PKCS5Padding填充加密方式是PKCS7Padding的子集,数据长度固定为8,也就是说加密是需要将长度为len 切分为8的倍数进行加密。

int main(int argc, char *argv[])
{unsigned char key[17] = "123456778";unsigned char iv[17] = {0};unsigned char output[1024];unsigned char output1[1024];size_t olen;size_t total_len = 0;mbedtls_cipher_context_t ctx;mbedtls_cipher_init(&ctx);mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setup(&ctx,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_setkey(&ctx, key, 128, MBEDTLS_ENCRYPT);mbedtls_cipher_set_iv(&ctx, iv, 16);mbedtls_cipher_reset(&ctx);char aa[9] = "12345678";printf("\n aa len  = %d \n",strlen(aa));mbedtls_cipher_update(&ctx, aa, strlen(aa), output, &olen);printf("\nolen = %d\n", olen);int inlen = olen;mbedtls_cipher_finish(&ctx, output + olen, &olen);inlen += olen;memcpy(output1 , output, inlen);printf("\nolen = %d\n", olen);printf("\n inlen = %d\n", inlen);mbedtls_cipher_free(&ctx);mbedtls_cipher_context_t ctx1;mbedtls_cipher_init(&ctx1);mbedtls_cipher_set_padding_mode(&ctx1, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setup(&ctx1,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_setkey(&ctx1, key, 128, MBEDTLS_DECRYPT);memset(iv, 0, sizeof(iv));mbedtls_cipher_set_iv(&ctx1, iv, 16);mbedtls_cipher_reset(&ctx1);int OLEN1 = 0;memset(aa,0,sizeof(aa));mbedtls_cipher_update(&ctx1, output1, inlen, aa, &OLEN1);total_len = OLEN1;mbedtls_cipher_finish(&ctx1, aa + OLEN1, &OLEN1);total_len += OLEN1;aa[total_len] = 0;printf("\n aa = %s \n", aa);mbedtls_cipher_free(&ctx1);getchar();
}

注:mbedtls会在xxx.c文件的最后,写一个类似mbedtls_aes_self_test的明白,不知道用法时可以参考

1.8 mbedtls AES_128_CBC使用pkcs5padding加密问题

1、填充方式概念
在采用aes加密或者其他加密方式时,我们会接触到填充方式的概念,一般有ZeroPadding、PKCS5Padding与PKCS7Padding方式。
ZeroPadding 数据长度不对齐时使用0填充,否则不填充。
PKCS7Padding <1>已对齐,填充一个长度为blockSize且每个字节均为blockSize的数据。
<2>未对齐,需要补充的字节个数为n,则填充一个长度为n且每个字节均为n的数据。
这里针对aes加密来说,blockSize就是16。
PKCS5Padding,PKCS7Padding的子集,只是块大小固定为8字节。

#include "mbedtls/aes.h"
#include "mbedtls/cipher.h"
int aes_cbc_128_test()
{unsigned char key[] = "12345678";unsigned char iv[] =  "87654321";static unsigned char data[1024]= "abcdefgh";static unsigned char input_buf[1024] = {0};static unsigned char output_buf[1024] = {0};int output_len;printf("\n data = %s\n",data);mbedtls_cipher_context_t ctx = {0};printf("\n >>>>>>>>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);mbedtls_cipher_init(&ctx);mbedtls_cipher_setup(&ctx,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setkey(&ctx, key, 128, MBEDTLS_ENCRYPT);mbedtls_cipher_set_iv(&ctx, iv, 16);mbedtls_cipher_reset(&ctx);int x=  strlen(data);int len =  x + (16 - x% 16);int data1 =  16 - (x % 16); //aes 加密要求16对齐,所以aes是没有pkcs5padding加密的,因为pkcs5padding要求8对齐memset(input_buf,data1,sizeof(input_buf));memcpy(input_buf,data,strlen(data));printf( "\n len = %d\n",len );mbedtls_cipher_update(&ctx, input_buf, len, output_buf, &output_len);printf("\noutput_len = %d \n",output_len);int inlen = output_len;mbedtls_cipher_finish(&ctx, output_buf + output_len, &output_len);printf("\noutput_len = %d \n",output_len);inlen+=output_len;mbedtls_cipher_free(&ctx);#if 1static unsigned char dec_buf[1024] = {0};mbedtls_cipher_context_t ctx1;mbedtls_cipher_init(&ctx1);mbedtls_cipher_setup(&ctx1,mbedtls_cipher_info_from_values(MBEDTLS_CIPHER_ID_AES, 128,MBEDTLS_MODE_CBC));mbedtls_cipher_set_padding_mode(&ctx1, MBEDTLS_PADDING_PKCS7);mbedtls_cipher_setkey(&ctx1, key, 128, MBEDTLS_DECRYPT);unsigned char deciv[] =  "87654321";mbedtls_cipher_set_iv(&ctx1, deciv, 16);mbedtls_cipher_reset(&ctx1);int OLEN1 = 0;mbedtls_cipher_update(&ctx1, output_buf, inlen, dec_buf, &OLEN1);int total_len = OLEN1;mbedtls_cipher_finish(&ctx1, dec_buf + OLEN1, &OLEN1);total_len += OLEN1;dec_buf[total_len] = 0;printf("\n aa = %s \n", dec_buf);mbedtls_cipher_free(&ctx1);
#endif // 0put_buf(output_buf,inlen);
#if 1static int base64[2048];if (mbedtls_base64_encode((unsigned char *)base64, sizeof(base64), &len,(const unsigned char *)output_buf, inlen)) {puts("mbedtls_base64_encode failed\n");}printf("\n base64 = %s\n", base64);
#endif
}

1.9签名和验签

定义生成签名的接口 rsa_pkcs1v15_sha256_sign,输入参数有原始数据msg、用于签名的私钥priavte_key_pem、保存签名输出数据的地址sign_base64

int rsa_pkcs1v15_sha256_sign(const unsigned char *msg, size_t msg_len,const char *priavte_key_pem, char *sign_base64, int sign_len)
{mbedtls_pk_context pk;mbedtls_entropy_context entropy;mbedtls_ctr_drbg_context ctr_drbg;uint8_t sig_buff[SIGNATURE_MAX_SIZE];unsigned char hash[32] = {0};size_t sig_len = 0;int ret = 0;char *b64_out = NULL;int b64_len = 0;const char *pers = "mbedtls_pk_sign";       // Personalization data,// that is device-specific identifiers. Can be NULL.// 初始化随机数生成器mbedtls_entropy_init( &entropy );mbedtls_ctr_drbg_init( &ctr_drbg );//初始化上下文mbedtls_pk_init( &pk );mbedtls_ctr_drbg_seed( &ctr_drbg,mbedtls_entropy_func,&entropy,(const unsigned char *) pers,strlen( pers ) );//导入私钥ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)priavte_key_pem,strlen(priavte_key_pem)+1,NULL, 0);if(ret != 0){ret = -1;goto exit;}// 计算 sha256 消息摘要ret = mbedtls_md(mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),(const unsigned char *)msg, msg_len, hash);if(ret != 0){ret = -1;goto exit;}// 签名ret = mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256, hash, sizeof (hash), sig_buff, &sig_len, mbedtls_ctr_drbg_random, &ctr_drbg);if(ret != 0){ret = -1;goto exit;}b64_out = malloc(sig_len*2);if(b64_out == NULL){ret = -1;goto exit;}// 对签名数据进行 base64 编码ret = mbedtls_base64_encode((unsigned char *)b64_out, sig_len*2,(size_t *)&b64_len, (unsigned char *)sig_buff, (size_t)sig_len);if(ret != 0){ret = -1;goto exit;}if(sign_len<b64_len){ret = -1;goto exit;}strncpy(sign_base64, b64_out, sign_len);exit:if(b64_out){free(b64_out);}mbedtls_pk_free( &pk );mbedtls_ctr_drbg_free( &ctr_drbg );mbedtls_entropy_free( &entropy );return ret;}

生成签名的测试代码

static void test_rsa_pkcs1_sign(void)
{int ret = 0;char *private_key = "-----BEGIN RSA PRIVATE KEY-----\n""MIICXQIBAAKBgQDTt8tp4xNp29CMxy6QS0NzpR6t8bAcv7ei3NkVM/Nzg3K5wWZR\n""aBTMovbzKCXdXYdC6GutVkG+CEetO3XHM4LhDqW0vwISTO65/XrvR3zqXD5ZjrJF\n""mtCAvkCwtMAPjqXZ/RJnd8yrXuoz5cRqVgKmq5TZlGIIiTPIklxGIGof8QIDAQAB\n""AoGAFf1BJoiD5+sBdFmsq6ZxhUWZU+ImEzpTUZpD/riEWNNGe2YLoTlg7acgZH1f\n""P2hbJ9cZdemfTuQvw52JHE0sktCUM6R0wq5rlbDj740+5yZYzs9FlUntm6UtoU9w\n""tpd62/iPxovFkguunJB2KBbtP8q0dYQntATEce1TZuS3trUCQQDl7VRYygSb3/HY\n""ij2ya1592WpgNWgmPvbpmUjGGBvjmnO8Ye1lEy6x69RmGjRrLvFfhWYwcF2HpmYQ\n""9wXKEwT1AkEA67nc/CdeT4j9jRE/QFXlhVrW8Gq8IfjXFGbGK5BqlTRbty3OpW+L\n""M9GPqiMC2XxN60peEiANlQ8aUnvbHZexjQJAcz4RGK+ov7fvL+maIuNN6SYf+zjJ\n""iuHkQBFkOGW9FMdFWxZ6Nj73GJZrTwGzZEWTFZ13KrAnMOZmIfquHCqMQQJBAL+u\n""x9ATg1FRqDyKBdEfCCDEmXuuj4VggCUK3aKXMNRbWyk9iohkh+F/Sz+icLLBreri\n""8lPy1JidS14/cRJDRBECQQCT4oNvmV5CYzqkqbgwtLPi/FIjc6Zi26DGxBzL01V+\n""yTO1ZlOOUOtY4dPBnU4COkdq6hWqum/Q6kiVj91qAUHN\n""-----END RSA PRIVATE KEY-----";char *msg = "A message for signing";char sign[1024] = {0};ret = rsa_pkcs1v15_sha256_sign((const unsigned char *)msg, strlen(msg), private_key, sign, sizeof (sign));printf("rsa_pkcs1v15_sha256_sign ret=%d\r\n", ret);if(ret == 0){printf("sign:%s\r\n", sign);}}

输出结果

rsa_pkcs1v15_sha256_verify ret=0
hash digest before sig
47F53245CD05A2B3E811AD6515000B44604B947A57D441B02125B04F4A16BB74
rsa_pkcs1v15_sha256_sign ret=0
sign:KYiZF/C18O3wgCZvDptfM8Vh/OPMrcAf6ne9eszSuxgGMK57cKCQuWc33JF8iQmKWrSo+ezzkPJIfXGTj3z3Js9vv1DC2tX3oBh9CdZF+yc5MqZAT5LEEqmwNKWiT4iNwwnbXiJtNSy8/T2PRRN0PBy/TZn3HKc1AMKMYMLUjf8=

在c中使用 mbedtls 库进行签名验签,使用到 pk.h、md.h 和 base64.h 这几个头文件定义的接口。

先定义和实现验证签名的接口 rsa_pkcs1v15_sha256_verify,输入参数有原始消息 msg,PEM 格式的公钥 public_key_pem,以及base64 编码后的签名数据 sign_base64。

#include "mbedtls/pk.h"
#include "mbedtls/md.h"
#include "mbedtls/base64.h"/*** @brief rsa_pkcs1v15_sha256_verify* * @param [in] msg* @param [in] msg_len* @param [in] public_key_pem* @param [in] sign_base64* @return int *  -- 0  verify pass*  -- -1 verify faild*/
int rsa_pkcs1v15_sha256_verify(const unsigned char *msg, size_t msg_len,const char *public_key_pem, const char *sign_base64)
{mbedtls_pk_context pk = {0};unsigned char hash[32] = {0};int ret = 0;size_t sign_len = 0;size_t b64out_len = 0;unsigned char *b64out_data = NULL;// 初始化上下文mbedtls_pk_init( &pk);// 导入公钥ret = mbedtls_pk_parse_public_key(&pk, (const unsigned char *)public_key_pem, strlen(public_key_pem)+1);if(ret != 0){ret = -1;goto exit;}// 对需要验签的数据进行 sha256 计算,生成消息摘要数据ret = mbedtls_md(mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),(const unsigned char *)msg, msg_len, hash);if(ret != 0){ret = -1;goto exit;}// 对原始签名数据进行 base64 解码sign_len = strlen(sign_base64);b64out_data = malloc(sign_len*2);memset(b64out_data, 0, sign_len*2);ret = mbedtls_base64_decode(b64out_data, sign_len*2, &b64out_len, (const unsigned char *)sign_base64, sign_len);if(ret != 0){ret = -1;goto exit;}// 验证签名ret = mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256, hash, sizeof (hash), b64out_data, b64out_len);exit:if(b64out_data){free(b64out_data);}mbedtls_pk_free( &pk );return ret;}
测试验签代码如下static void test_rsa_pkcs1_verify(void)
{int ret = 0;// 公钥char *pub_key = "-----BEGIN PUBLIC KEY-----\n""MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTt8tp4xNp29CMxy6QS0NzpR6t\n""8bAcv7ei3NkVM/Nzg3K5wWZRaBTMovbzKCXdXYdC6GutVkG+CEetO3XHM4LhDqW0\n""vwISTO65/XrvR3zqXD5ZjrJFmtCAvkCwtMAPjqXZ/RJnd8yrXuoz5cRqVgKmq5TZ\n""lGIIiTPIklxGIGof8QIDAQAB\n""-----END PUBLIC KEY-----";// 原始消息char *msg = "A message for signing";// base64 编码之后的签名数据char * sign = "KYiZF/C18O3wgCZvDptfM8Vh/OPMrcAf6ne9eszSuxgGMK57cKCQuWc33JF8iQmKWrSo""+ezzkPJIfXGTj3z3Js9vv1DC2tX3oBh9CdZF+yc5MqZAT5LEEqmwNKWiT4iNwwnbXiJt""NSy8/T2PRRN0PBy/TZn3HKc1AMKMYMLUjf8=";ret = rsa_pkcs1v15_sha256_verify((const unsigned char *)msg, strlen(msg), pub_key, sign);printf("rsa_pkcs1v15_sha256_verify ret=%d\r\n", ret);}
输出,返回值为0,验签成功。rsa_pkcs1v15_sha256_verify ret=0

相关文章:

mbedtls加密组件使用示例

1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf calloc(1, 257);char *outbuf calloc(1, 257);char *buf calloc(1,257);char *tmp_outbuf outbuf;char *tmp_buf buf;mbedtls_aes_context aes_ctx;mb…...

如何量测太阳光模拟器的光谱致合度?

太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸&#xff0c;光斑强度的输出功率范围可以从0.1到1太阳光强度。此外&#xff0c;还提供了灵活的出光方向&#xff0c;以满足用户的研究需求&a…...

网络安全领域中CISP证书八大类都有什么

CISP​注册信息安全专业人员 注册信息安全专业人员&#xff08;Certified Information Security Professional&#xff09;&#xff0c;是经中国信息安全产品测评认证中心实施的国家认证&#xff0c;对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...

17- 梯度提升回归树GBRT (集成算法) (算法)

梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法&#xff0c;它的特点在于纠正与加强&#xff0c;通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题&#xff0c;也可以用于回归问题中。在该模型中&#xff0c;有三个重要参数分别为 n_…...

05 OpenCV色彩空间处理

色彩空间&#xff08;Color Space&#xff09;是一种用于描述颜色的数学模型&#xff0c;它将颜色表示为多维向量或坐标&#xff0c;通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异&#xff0c;不同的…...

【CS224图机器学习】task1 图机器学习导论

前言&#xff1a;本期学习是由datawhale&#xff08;公众号&#xff09;组织&#xff0c;由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习&#xff1f;通过图这种数据结构&#xff0c;对跨模态数据进行整理。…...

Powershell Install SQL Server 2022

前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…...

Jetson NX2 装机过程

1.固态硬盘安装完成后&#xff0c;系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址&#xff0c;以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3&#xff0c;安装有问题报错illegal instruction&#xff0c;未解决。 4.VNC远程登录 …...

初始C++(四):内联函数

文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 二.内联函…...

九、初识卷积

文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时&#xff0c;神经网络的前几层需要完成对图像的边缘检测任务&#xff0c;所谓的边缘检测就是让计算机识别出一张图片的垂直…...

【Linux】【编译】编译调试过程中如何打印出实际的编译命令

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…...

linux安装jdk

step1 下载jdk 到下面的网站下载需要的jdk安装包版本。 Java Downloads | Oracle step2 复制到opt目录 其中user_name对应自己的home目录的用户文件夹 sudo cp /home/user_name//home/czh/Downloads/jdk-17_linux-x64_bin.tar.gz /opt/ step3 到opt目录解压安装包&#xf…...

迅为iTOP-3A5000龙芯开发板安装UOS操作系统

3A5000板卡采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;&#xff0c;市面上龙芯3A5000主板价格都在上万元&#xff0c;可以说是非常贵了&#xff0c; 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…...

如何使用ArcGIS转换坐标

1.概述大家都知道ArcGIS提供了坐标转换功能&#xff0c;在我们手里的数据坐标系千差万别&#xff0c;经常会遇到转换坐标的时候&#xff0c;那么是否可以用ArcGIS进行转换&#xff1f;答案是肯定的&#xff0c;但是转换的过程比较复杂&#xff0c;这里为大家介绍一下转换的方法…...

链表基本原理

链表基本原理1.链表1.1 基本原理1.2 链表大O记法表示2. 链表操作2.1 读取2.2 查找2.3 插入2.4 删除3.链表代码实现1.链表 1.1 基本原理 节点 组成链表的数据格子不是连续的。可以分布在内存的各个位置。这种不相邻的格子就叫结点。每个结点保存数据还保存着链表里的下一结点的…...

基于JAVA+SpringBoot+Vue+ElementUI中学化学实验室耗材管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 当前&#xff0c;中学…...

1.输入子系统学习-struct input_dev-2023.02

内核版本&#xff1a;4.4.194 平台相关&#xff1a;rk3399 目前主要是看的触摸屏的代码 目录 一、include/linux/input.h&#xff08;struct_input_dev&#xff09; 二、结构体的注释部分&#xff08;百度翻译&#xff09; 三、Documentation/input/event-codes.txt&…...

解决:PDFBox报的java.io.IOException: Missing root object specification in trailer

文章目录问题描述原因分析解决方案问题描述 使用pdfbox类库操作pdf文件时&#xff0c;遇到下面的报错信息&#xff1a; java.io.IOException: Missing root object specification in trailer PDFBox参考&#xff1a; https://pdfbox.apache.org/ Apache PDFBox 库是一个开源的…...

MAC OSX安装Python环境 + Visual Studio Code

MAC上开发python怎么能少得了python3环境呢&#xff0c;而安装python3环境的方式也有多种&#xff0c;这里仅选用并记录本人认为比较方便的方式 安装Homebrew Homebrew是macOS 缺失的软件包管理器&#xff0c; 使用它可以在MAC上安装很多没有预装的东西&#xff0c;详细说明可…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...