承接上篇,我们初步了解了mbedtls的文件路径以及文件作用以后就是想着如何将mbedtls移植到各种平台。
博主这里移植一个高级的算法--非对称性算法rsa算法移植。
建立工程和MD是一样的,没有什么区别。
这里博主讲解下测试代码里面使用的API,博主自己理解的角度讲解测试待。
1.不定秘钥RSA加解密
工程主要实现RSA算法+V21 padding+ 加解密功能,但是工程本次是使用不定秘钥做的加解密。
1.1 反向逆推算法需要依赖的API。首先最重要的API是加解密API mbedtls_rsa_pkcs1_encrypt 和mbedtls_rsa_pkcs1_decrypt。
从H文档函数定义可以看到,第一个参数就是RSA初始化的值,这里博主姑且把它称呼为RSA秘钥。第二个、第三参数都是和随机数功能相关的输入参数,这章博主说了这里采用的是不定秘钥做加解密,这就意味着第二个参数和第三个参数都应该保留。 第四个参数是明文的长度,这个长度一般小等于秘钥长度-padding的长度。 第五个参数输入明文,第六个参数是密文,密文长度等于秘钥的长度。
rsa一般有以下几种1024-bit,意味着密文长度 = 1024/8 = 126字节。更往上的还有2048,3072,4096等几种长度。
1.2 既然要使用到秘钥,那么不可缺少的一个函数就是秘钥生成函数mbedtls_rsa_gen_key。
由mbedtls_rsa_gen_key说明可知,第二个参数,第三个参数随机数也是很重要的。然后我们需要定义使用到的key的长度以及指数的基准,当然这里也给了例程,一般使用65537作为指数。并且要在mbedtls_rsa_init()mbedtls_rsa_gen_key之前调用mbedtls_rsa_init。
1.3 为了使用mbedtls_rsa_gen_key里面的随机数和秘钥生成的必要的随机数结构体和熵结构体,还有三个函数也需要使用到。
mbedtls_ctr_drbg_seed,mbedtls_entropy_init,mbedtls_ctr_drbg_init。并且后两个函数还需要在mbedtls_ctr_drbg_seed之前调用。
根据以上逻辑最后得到的函数就是这种逻辑:
int ret;
size_t olen = 0;
uint8_t out[2048/8];
mbedtls_rsa_context ctx; //RSA密钥结构体
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
const char *pers = "simple_rsa";
const char *msg = "Hello, World!";
mbedtls_entropy_init(&entropy);//初始化熵结构体
mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体
//rsa结构体初始化
mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V21, //填充方案OAEP
MBEDTLS_MD_SHA256); //SHA256做散列算法
ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
(const uint8_t *) pers, strlen(pers));//根据个性化字符串更新种子
mbedtls_printf("\n . setup rng ... ok\n");
mbedtls_printf("\n ! RSA Generating large primes may take minutes! \n");
//生成RSA密钥
ret = mbedtls_rsa_gen_key(&ctx, mbedtls_ctr_drbg_random, //随机数生成接口
&ctr_drbg, //随机数结构体
2048, //模数位长度
65537);//公开指数0x01001
mbedtls_printf("\n 1. RSA generate key ... = %d\n",ret );
//RSA加密
ret = mbedtls_rsa_pkcs1_encrypt(&ctx, mbedtls_ctr_drbg_random, //随机数生成接口
&ctr_drbg, //随机数结构体
MBEDTLS_RSA_PUBLIC, //公钥操作
strlen(msg), //消息长度
msg, //输入消息指针
out); //输出密文指针
printf(" 加密结果 = %d\n",ret );
按照我们对mbedtls_rsa_pkcs1_encrypt的理解,如果解密成功,ret的值一定是0,反之就会报错。
实际VS工程可以访问博主的Git仓库: