[技术问答] 赛元单片机的UID在哪里?

[复制链接]
322|13
 楼主 | 2019-9-28 12:14 | 显示全部楼层 |阅读模式
数据手册上没有,是不是赛元单片机没这个功能?
赛元单片机用什么加密?

使用特权

评论回复

评论

knk 2019-10-7 20:14 回复TA
91/92/93的芯片可以烧录滚动码,最长可以支持32位,95的芯片有UID 
| 2019-9-29 13:57 | 显示全部楼层
赛元MCU就没有这个,我的办法是产生4个随机数,按这4个地址在CODE区里找到4个字节的数据作为UID,这样也可以,跟自带的UNIQUE ID效果一样

使用特权

评论回复
 楼主 | 2019-9-29 14:36 | 显示全部楼层
taobaofarmer 发表于 2019-9-29 13:57
赛元MCU就没有这个,我的办法是产生4个随机数,按这4个地址在CODE区里找到4个字节的数据作为UID,这样也可 ...

请问你随机数的种子是什么?

使用特权

评论回复
| 2019-9-29 15:06 | 显示全部楼层
不需要种子呀

使用特权

评论回复
| 2019-9-29 15:51 | 显示全部楼层
赛元MCU,前256B禁止MOVC操作,可用于程序加密。加密方式可见92系列MCU应用指南,或工具使用手册

使用特权

评论回复
 楼主 | 2019-9-30 17:35 | 显示全部楼层

不需要种子?用的什么高级方法,没听说过呀?

使用特权

评论回复
| 2019-10-2 20:41 | 显示全部楼层
就用标准C函数产生一个随机数,还需要什么种子?

使用特权

评论回复
 楼主 | 2019-10-2 23:22 | 显示全部楼层
算了,看来你根本不知道这回事。
rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。

使用特权

评论回复
| 2019-10-7 13:55 | 显示全部楼层
楼上高人,今天我又学习了,搞了22年嵌入式开发今天终于又被学习了一回,RAND()之前确实没用过,也没啥用,所以一直没去了解它,刚刚百度了下SRAND(),确实有种子这回事儿,我之前的架构是在上位机软件里下发4个随机数给MCU,然后MCU把这4个随机数作为指针指向CODE区里相应位置的数据返回给上位机软件,作为MCU的UNIQUE ID,然后进行加密算法乱七八糟的一顿计算,现在看来还真得修改下上位机软件,每次rand()之前重新设置下种子,百度上介绍的经验是取当时的时间,这个方法不错,我就准备这么做了

使用特权

评论回复
 楼主 | 2019-10-7 20:52 | 显示全部楼层
taobaofarmer 发表于 2019-10-7 13:55
楼上高人,今天我又学习了,搞了22年嵌入式开发今天终于又被学习了一回,RAND()之前确实没用过,也没啥用, ...

不是什么高人,C语言课本里好像就有介绍,估计你是时间长不用,所以忘了。
对于随机数我记得rand这类函数都是通过线性同余法得到伪随机数,一般种子可以选
1、时间,如定时器值
2、AD采集温度或电源噪声
3、UID
4、搭建硬件电路产生种子

种子是随机数的重点。
也有单片机自带随机数发生器的,那就比较方便了,比如STM32F4自带了硬件随机数发生器(RNG)!

使用特权

评论回复
| 2019-10-12 13:46 | 显示全部楼层
仔细研究了下种子的问题,确实是重中之重,一顿折腾之后我在VC++6.0里实现如下:
        BYTE  m;
        WORD  i, crc16;
        DWORD rand_data[4], dwBuf0, dwBuf1, dwBuf2;

        SYSTEMTIME sysTime;
        GetLocalTime(&sysTime);

        i = sysTime.wYear      +
                sysTime.wMonth     +
                sysTime.wDay       +
                sysTime.wDayOfWeek +
                sysTime.wHour      +
                sysTime.wMinute    +
                sysTime.wSecond    +
                sysTime.wMilliseconds;
       
        dwBuf0   = ~i;
        dwBuf0 <<= 16;
        dwBuf0  += i;

        for(m=0; m<4; m++)
        {
                //循环右移5位后的数据作为下一个随机数的种子
                dwBuf1  = dwBuf0 << 27;
                dwBuf1 &= 0xfe000000;

                dwBuf2  = dwBuf0 >> 5;
                dwBuf2 &= 0x01ffffff;

                dwBuf0  = dwBuf1 + dwBuf2;
               
                dwBuf0  = ~dwBuf0;
                dwBuf0 ^=  0xxxxxxxxx;
       
                srand(dwBuf0);
                rand_data[m] = rand();
        }
你觉得这个效果如何?

使用特权

评论回复
 楼主 | 2019-10-12 17:15 | 显示全部楼层
taobaofarmer 发表于 2019-10-12 13:46
仔细研究了下种子的问题,确实是重中之重,一顿折腾之后我在VC++6.0里实现如下:
        BYTE  m;
        WORD   ...

如果实在电脑上,种子用时间CRC校验值做种子最方便,如果是单片机你这种移位处理是最常用的

使用特权

评论回复
| 2019-10-17 18:07 | 显示全部楼层
常用的CRC算法有哪些

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表