|

楼主 |
发表于 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; // 直接返回结果,不进行掩码
}
|
|