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毫米的光斑尺寸,光斑强度的输出功率范围可以从0.1到1太阳光强度。此外,还提供了灵活的出光方向,以满足用户的研究需求&a…...
网络安全领域中CISP证书八大类都有什么
CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional),是经中国信息安全产品测评认证中心实施的国家认证,对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...
17- 梯度提升回归树GBRT (集成算法) (算法)
梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题,也可以用于回归问题中。在该模型中,有三个重要参数分别为 n_…...
05 OpenCV色彩空间处理
色彩空间(Color Space)是一种用于描述颜色的数学模型,它将颜色表示为多维向量或坐标,通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异,不同的…...
【CS224图机器学习】task1 图机器学习导论
前言:本期学习是由datawhale(公众号)组织,由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习?通过图这种数据结构,对跨模态数据进行整理。…...
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.固态硬盘安装完成后,系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址,以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3,安装有问题报错illegal instruction,未解决。 4.VNC远程登录 …...
初始C++(四):内联函数
文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 二.内联函…...
九、初识卷积
文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时,神经网络的前几层需要完成对图像的边缘检测任务,所谓的边缘检测就是让计算机识别出一张图片的垂直…...
【Linux】【编译】编译调试过程中如何打印出实际的编译命令
🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏: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目录解压安装包…...
迅为iTOP-3A5000龙芯开发板安装UOS操作系统
3A5000板卡采用全国产龙芯3A5000处理器,基于龙芯自主指令系统(LoongArch),市面上龙芯3A5000主板价格都在上万元,可以说是非常贵了, 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...
Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)
Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接:https://sysin.org/blog/chrome-firefox-download/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 天下只剩三种(主流&am…...
如何使用ArcGIS转换坐标
1.概述大家都知道ArcGIS提供了坐标转换功能,在我们手里的数据坐标系千差万别,经常会遇到转换坐标的时候,那么是否可以用ArcGIS进行转换?答案是肯定的,但是转换的过程比较复杂,这里为大家介绍一下转换的方法…...
链表基本原理
链表基本原理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技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 当前,中学…...
1.输入子系统学习-struct input_dev-2023.02
内核版本:4.4.194 平台相关:rk3399 目前主要是看的触摸屏的代码 目录 一、include/linux/input.h(struct_input_dev) 二、结构体的注释部分(百度翻译) 三、Documentation/input/event-codes.txt&…...
解决:PDFBox报的java.io.IOException: Missing root object specification in trailer
文章目录问题描述原因分析解决方案问题描述 使用pdfbox类库操作pdf文件时,遇到下面的报错信息: java.io.IOException: Missing root object specification in trailer PDFBox参考: https://pdfbox.apache.org/ Apache PDFBox 库是一个开源的…...
MAC OSX安装Python环境 + Visual Studio Code
MAC上开发python怎么能少得了python3环境呢,而安装python3环境的方式也有多种,这里仅选用并记录本人认为比较方便的方式 安装Homebrew Homebrew是macOS 缺失的软件包管理器, 使用它可以在MAC上安装很多没有预装的东西,详细说明可…...
音乐 APP 用户争夺战,火山引擎 VeDI 助力用户体验升级!
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 国内数字音乐市场正在保持稳定增长。 根据华经产业研究院数据报告显示,2020 年数字音乐市场规模为 357.3 亿元,到 2022 年市场规模已增长至 482.7 …...
CAP和BASE理论
CAP理论CAP是 Consistency、Availability、Partition tolerance 三个词语的缩写,分别表示一致性、可用性、分区容忍性。它指出一个分布式计算系统不可能同时满足以下三点:• 一致性(Consistency) :等同于所有节点访问同…...
基于商品理解的成交能力和成交满意度优化在Lazada的实践
作者:马蕊 Lazada推荐算法团队 在Lazada各域推荐场景中,既有优质商品优质卖家不断涌现带来的机会,也有商品质量参差带来的问题。如何才能为用户提供更好的体验,对卖家变化行为进行正向激励呢?下面本文将为大家分享我们…...
idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。
windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…...
hive开窗函数
hive开窗函数 窗口函数 数据准备 1 jx 20 2 zx 24 3 yx 18 4 wz 10 5 yy 34 6 wy 25create table t (> id int,> name string,> age int> )> row format delimited fields terminated by ; load data inpath /data/data.txt into table t;ROW_NUMBER ROW_N…...
安全多方计算系列笔记1——前世今生
这一系列笔记参考了绿盟科技研究通讯的安全多方计算文章,及其他。 首先看定义:在不泄露参与方原始输入数据的前提下,允许分布式参与方合作计算任意函数,输出准确的计算结果。 起源 安全多方计算问题及解首先由姚期智(…...
16- 梯度提升分类树GBDT (梯度下降优化) (算法)
梯度提升算法 from sklearn.ensemble import GradientBoostingClassifier clf GradientBoostingClassifier(subsample0.8,learning_rate 0.005) clf.fit(X_train,y_train) 1、交叉熵 1.1、信息熵 构建好一颗树,数据变的有顺序了(构建前,…...
SpringCloud+Nacos+Gateway
SpringCloudNacosGatewaySpringBoot整合GatewayNacos一. 环境准备1. 版本环境2. 服务环境二. 实战1.创建用户服务2.创建订单服务3.创建网关服务4.测试三. 避坑指南问题1--503问题问题2--网关服务启动报错SpringBoot整合GatewayNacos 本篇文章只演示通过gateway网关服务访问其他…...
高通开发系列 - linux kernel内核升级msm-3.18升至msm-4.9(2)
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 返回高通开发系列 - 总目录 前面我们升级了msm-4.9内核系统正常启动了,文件系统也正常工作,但那是使用了老基线的文件系统,其yocto…...
Spring依赖注入与反转控制到底是个啥?
目录 1. 引言 2. 管中窥豹 3.1 Spring 依赖注入 3.2 Bean 的依赖注入方式有两种 4. 总结 1. 引言 此文目的是用通俗易懂的语言讲清楚什么是依赖注入与反转控制,在看了大量的博客文章后归纳总结,便于后续巩固!我相信,大多数…...
网站百度没收录/seo全称是什么意思
bug描述: https://jira.qos.ch/browse/LOGBACK-1175 commits: https://github.com/qos-ch/logback/commit/f264607fb450 但是!!!这个bug在1.3.0-alpha1中才修复,最新的released版本1.2.3中,这个bug依旧存…...
wordpress注册添加算术验证/成品短视频app下载有哪些
面试一个公司,和那边技术负责人讨论了一个关于启动一个Service,首先问了我一下有什么启动方式,然后各自生命周期是怎样的,都一一回答,接着就问如果一个Service通过两种方式使用,然后怎么进行关闭࿰…...
网站备案背景布/站牛网是做什么的
作者:张华 发表于:2016-02-25 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 使用gdb或者crash时需要debug symbols, 可以从http://ddebs.ubuntu.…...
网站开发的最后5个阶段/山东自助seo建站
字体 Serif(有衬线体)和Sans Serif(无衬线体): Serif有额外的装饰。Sans Serif笔画粗细差不多。Serif容易辨认和阅读。Sans Serif容易造成困扰。 常见的无衬线字体有Arial, Helvetica, 中文的幼圆、隶书等等 常见的…...
网站内部链接有什么作用/优化营商环境的金句
敏捷软件开发中,最重要实践的就是测试驱动开发,在单元测试层面,我们试着实现一个重要的指标就是测试覆盖率。测试覆盖率衡量我们的代码是否已经全部被测试到了。 但是指标本身不是目的,借助测试覆盖率检查,我们希望发现…...
做音乐网站怎么放音乐/网推软件有哪些
零基础情况下,想学一门语言。其实python非常适合初学者入门。相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易。那么如何快速掌握python? 设定目标:做 Python 开发除了熟悉语言本身之外,还需要掌握很多…...