首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

乐鑫Esp32学习之旅 22 讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等,附带Demo;

  • 23-11-14 06:42
  • 3780
  • 8529
blog.csdn.net

  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。
18、入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
19、重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!
20、一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。
21、 esp32蓝牙配网blufi的高度封装,集成简单、使用简单、容易上手,提高开发效率!
22、讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等!

在这里插入图片描述

文章目录

    • 在这里插入图片描述
  • 一、前言
    • 1.1 Md5加密
    • 1.2 Sha1加密
    • 1.3 AES - ECB加密、解密
    • 1.4 AES - ECB加密、解密
    • 1.5 AES-CBC 加密解密
  • 二、其他
    • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

一、前言

在这里插入图片描述
    很庆幸能生活在如今的中国,物质条件和以前相比直线提高,没有任何能够理由抱怨社会、抱怨身边的是非!

    此生无悔入华夏,来生愿在种花家。

    近些年是互联网的寒冬,很大的大型公司都在大规模裁员,滴滴、360、乐视、蘑菇街、暴风魔镜等巨头公司都在其列!说到底,还是中国互联网行业对程序员门槛在提高!

    这些年一直有个说法,“程序员青春饭”,这是一个很现实的问题,不能回避!其然,很多行业都有这样的说法,比如说酒店里面的前台,服务员,酒吧里面的前台,服务员等等,很多服务行业基本上都是如此,他们需要年轻的人,一群有活力,有颜值的人,毕竟这也是个看脸的世界。只是在IT行业,这个说法被提到的更加突出!

    因为计算机,特别是算法,需要很长时间的沉淀,需要踩很多坑,做很多总结,看大量别人的成果,才能有所突破。

    因为这个行业与其他行业不同,其他行业你可以靠一个经验二十年,但计算机行业需要的是不停的学习,有着极高的复杂度,很多在一线编写的程序员无法跟上节奏会逐渐离开换管理或者转行。计算机行业基本上每3-5年,你所学过的知识就需要重新更新一遍。

    说白了水平层次没达到,35岁的技术水平跟20刚出头的没什么差别,公司凭啥不要招聘年轻的!

    最后,希望大家一起学习,关注我公众号,一起奋斗!

    因乐鑫esp-idf框架集成开源的 mbedtls 加密库,所以很大程度上,下面分享的代码,不仅仅适用esp32或esp8266,也适合像 stm32 这样流行的arm芯片!

1.1 Md5加密

    下面是对字符串变量encrypt加密,参考网址对比如下:
    在线MD5加密:https://www.cmd5.com

/**
 * @description: md5加密  32位输出
 * @param {type} 
 * @return: 
 */
static void TaskMd5(void *parm)
{

    unsigned char encrypt[] = "https://blog.csdn.net/xh870189248";
    unsigned char decrypt[16];
    mbedtls_md5_context md5_ctx;
    mbedtls_md5_init(&md5_ctx);
    mbedtls_md5_starts(&md5_ctx);
    mbedtls_md5_update(&md5_ctx, encrypt, strlen((char *)encrypt));
    mbedtls_md5_finish(&md5_ctx, decrypt);
    ESP_LOGI(LOG_TAG, "Md5加密前:[%s] 
 md5加密后(32位):", encrypt);

    for (int i = 0; i < 16; i++)
    {
        printf("%02x", decrypt[i]);
    }
    mbedtls_md5_free(&md5_ctx);

    printf("
");
    vTaskDelete(NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

1.2 Sha1加密

    下面是对字符串变量encrypt加密,参考网址对比如下:
    在线Sha1加密:http://www.3464.com/tools/sha1


/**
 * @description: sha1加密
 * @param {type} 
 * @return:     
 */
static void TaskSha1(void *parm)
{
    int i;

    unsigned char decrypt[32];
    const unsigned char encrypt[] = "https://github.com/xuhongv";
    ESP_LOGI(LOG_TAG, "Sha1 要加密数据: %s", encrypt);

    mbedtls_sha1_context sha1_ctx;
    mbedtls_sha1_init(&sha1_ctx);
    mbedtls_sha1_starts(&sha1_ctx);
    mbedtls_sha1_update(&sha1_ctx, encrypt, strlen((char *)encrypt));
    mbedtls_sha1_finish(&sha1_ctx, decrypt);
    mbedtls_sha1_free(&sha1_ctx);

    ESP_LOGI(LOG_TAG, "Sha1 加密后数据:");
    for (i = 0; i < 20; i++)
    {
        printf("%02x", decrypt[i]);
    }
    vTaskDelete(NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

1.3 AES - ECB加密、解密

    下面是对字符串变量 plain加密,注意参考网址对比:
    在线ECB加密:http://tool.chacuo.net/cryptaes

     !!! ECB模式只能实现16字节的明文加解密。 !!!

/**
 * @description: ECB加密解密:数据块128位 偏移量为0,没填充
 * @param {type} !!!! ECB模式只能实现16字节的明文加解密。 !!!
 * @return: 
 */
static void TaskECB(void *parm)
{

    ESP_LOGI(LOG_TAG, "AES-ECB 加密-数据块(128位),偏移量为0");

    mbedtls_aes_context aes_ctx;
    //密钥数值
    unsigned char key[16] = {'e', 'c', 'b', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '1', '2', '3', '4'};
    //明文空间
    unsigned char plain[16] = "csdn-xuhong";
    //解密后明文的空间
    unsigned char dec_plain[16] = {0};
    //密文空间
    unsigned char cipher[16] = {0};

    mbedtls_aes_init(&aes_ctx);
    //设置加密密钥
    mbedtls_aes_setkey_enc(&aes_ctx, key, 128);
    ESP_LOGI(LOG_TAG, "要加密的数据: %s", plain);
    ESP_LOGI(LOG_TAG, "加密的密码: %s", key);
    mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, plain, cipher);
    ESP_LOGI(LOG_TAG, "加密结果,二进制表示: ");
    for (int loop = 0; loop < 16; loop++)
        printf("%02x", cipher[loop]);
    printf("
");

    //设置解密密钥
    mbedtls_aes_setkey_dec(&aes_ctx, key, 128);
    mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT, cipher, dec_plain);
    ESP_LOGI(LOG_TAG, "解密后的数据: %s", dec_plain);
    mbedtls_aes_free(&aes_ctx);
    vTaskDelete(NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 操作截图:
    在这里插入图片描述

1.4 AES - ECB加密、解密

    下面是对字符串变量encrypt加密,参考网址对比如下:
    在线Sha256加密:http://convertstring.com/zh_CN/Hash/SHA256

/**
 * @description: SHA-256 或 SHA-244
 * @param {type} 
 * @return: 
 */
static void TaskSha256(void *parm)
{
    int i;

    unsigned char decrypt[32];
    const unsigned char encrypt[] = "https://github.com/xuhongv";
    // sha256/224
    ESP_LOGI(LOG_TAG, "Sha256 要加密数据: %s", encrypt);
    mbedtls_sha256_context sha256_ctx;
    mbedtls_sha256_init(&sha256_ctx);
    mbedtls_sha256_starts(&sha256_ctx, 0); // 0表示传sha256 , 1 表示传SHA-244
    mbedtls_sha256_update(&sha256_ctx, encrypt, strlen((char *)encrypt));
    mbedtls_sha256_finish(&sha256_ctx, decrypt);
    ESP_LOGI(LOG_TAG, "Sha256 加密后数据: ");
    for (i = 0; i < 32; i++)
    {
        printf("%02x", decrypt[i]);
    }
    mbedtls_sha256_free(&sha256_ctx);
    vTaskDelete(NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

1.5 AES-CBC 加密解密

    下面是对字符串变量encrypt加密,参考网址对比如下:
    在线CBC加密:http://tool.chacuo.net/cryptaes

/**
 * @description: 
 * @param {type} 
 * @return: 
 */
static void TaskAESCBC(void *parm)
{
    int i;

    mbedtls_aes_context aes_ctx;

    //密钥数值
    unsigned char key[16] = {'c', 'b', 'c', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '1', '2', '3', '4'};
    //iv
    unsigned char iv[16];

    //明文空间
    unsigned char plain[64] = "https://github.com/xuhongv";
    //解密后明文的空间
    unsigned char dec_plain[64] = {0};
    //密文空间
    unsigned char cipher[64] = {0};

    mbedtls_aes_init(&aes_ctx);

    //设置加密密钥
    printf("plain:%s
", plain);
    mbedtls_aes_setkey_enc(&aes_ctx, key, 128);
    for (i = 0; i < 16; i++)
    {
        iv[i] = 0x01;
    }
    mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, 64, iv, plain, cipher);
    printf("cipher:
");

    for (i = 0; i < 64; i++)
    {
        printf("%02x", cipher[i]);
    }
    printf("
");
    //设置解密密钥
    mbedtls_aes_setkey_dec(&aes_ctx, key, 128);
    for (i = 0; i < 16; i++)
    {
        iv[i] = 0x01;
    }
    mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, 64, iv, cipher, dec_plain);
    printf("dec_plain:%s
", dec_plain);
    printf("
");
    mbedtls_aes_free(&aes_ctx);

    vTaskDelete(NULL);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 注意偏移量为十六进制,操作截图:
    在这里插入图片描述

二、其他

  • 下面记下AES加密类型一览表:
算法/模式/填充字节加密后数据长度不满16字节加密后长度
AES/CBC/NoPadding16不支持
AES/CBC/PKCS5Padding3216
AES/CBC/ISO10126Padding3216
AES/CFB/NoPadding16原始数据长度
AES/CFB/PKCS5Padding3216
AES/CFB/ISO10126Padding3216
AES/ECB/NoPadding16不支持
AES/ECB/PKCS5Padding3216
AES/ECB/ISO10126Padding3216
AES/OFB/NoPadding16原始数据长度
AES/OFB/PKCS5Padding3216
AES/OFB/ISO10126Padding3216
AES/PCBC/NoPadding16不支持
AES/PCBC/PKCS5Padding3216
AES/PCBC/ISO10126Padding3216

       有任何疑问联系本人下方邮箱或加qq群或文章留言,不要私信我,我已经屏蔽私信!多多支持!

       本博文对应的源码获取 请关注本人的微信公众号回复 191214 获取,谢谢!


另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群付费QQ群,不喜的朋友勿喷勿加:434878850
  • 个人邮箱:[email protected] 24小时在线,有回必回复!
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 关注下面微信公众号二维码,干货多多,第一时间推送!
注:本文转载自blog.csdn.net的半颗心脏的文章"https://blog.csdn.net/xh870189248/article/details/103539421"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top