JL杰理蓝牙芯片交流论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 202|回复: 1

尝试理解杰理的安全机制

[复制链接]

2

主题

22

回帖

255

积分

中级会员

Rank: 4

积分
255
发表于 2025-6-3 00:37:51 | 显示全部楼层 |阅读模式

注册登录,了解更多芯片技术。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
尝试理解杰理的安全机制

https://oshwhub.com/album/jerry-security-note
回复

使用道具 举报

2

主题

22

回帖

255

积分

中级会员

Rank: 4

积分
255
 楼主| 发表于 2025-6-3 09:45:47 | 显示全部楼层
杰理的Cipher需要许多的基础知识和数学运算,计划用3-4章的篇幅学习一下;基本会涉及到CRC-16/CRC-32;AES/DES对称密钥;可能还会用到RSA/ECC私钥;以及其他的相关知识。

之前很简单的了解过CRC-16,知道是一种保证数据完整性算法,缺少纠错机制。CRC是通用的简单有效的算法,有必要先学习一下。
CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理,实现错误侦测的功能,具有原理清晰、实现简单等优点。
这个算法Python的格式可以是crcmod.mkCrcFun(0x11021, initCrc=0x0000, rev=False),但是不懂“爬虫”,只好借助deepseek翻译为C语言,大体知道是怎么回事:
1.        第一个参数是多项式;0x11021,其实就是常说的   x^16 + x^12 + x^5 + 1
2.        第二个参数是初始值;Crc = 0x0000(CRC16/XMODEM),也可以是0x0FFFF(CRC-16/CCITT);或者是其他值;
3.        第三个参数要求是否反转;rev=False ,表示输入数据不需要按位反转。
#include <stdint.h>
#include <stddef.h>
uint16_t crc16_ccitt_bit(const uint8_t *data, size_t len)
{  uint16_t crc = 0x0000;  // 初始值为0x0000 CRC16/XMODEM
    for (size_t i = 0; i < len; i++)
      {  uint8_t byte = data[i];
        for (int j = 0; j < 8; j++)   // 处理每个字节的8个位
          {// 提取当前处理的位(从最高位到最低位)
            uint8_t bit = (byte >> 7) & 0x01;
            byte <<= 1;  // 左移准备处理下一个位
            // 计算CRC寄存器的最高位
            uint16_t top = (crc >> 15) & 0x01;
            crc = (crc << 1);  // 左移一位
            // 若最高位与当前数据位异或为1,则异或多项式0x1021
            if (top ^ bit)     crc ^= 0x1021;
           }
       }
    return   crc;  // 直接返回结果,不进行掩码
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|JL杰理蓝牙芯片交流论坛 ( 粤ICP备18068352号 )

GMT+8, 2025-7-12 15:27 , Processed in 0.086120 second(s), 22 queries .

Powered by yunthinker云信

© 2001-2023 yunthinker Team.

快速回复 返回顶部 返回列表