打印
[PIC®/AVR®/dsPIC®产品]

如何用C编写一个密匙程序

[复制链接]
1612|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小海豚|  楼主 | 2013-10-8 21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小海豚 于 2013-10-9 09:13 编辑

运行程序写好以后想给它密,但是不是直接加密,是让程序正常运行3次以后,必须用密码激活才能继续正常使用。这个小程序怎么编写,
沙发
小海豚|  楼主 | 2013-10-9 08:22 | 只看该作者

使用特权

评论回复
板凳
yewuyi| | 2013-10-9 15:53 | 只看该作者
使用带内部EEPROM或者支持FLASH自擦写的MCU。

做一个标志,运行3次后就将该标志置位并写入EEPROM或者FLASH中,代码定时读取该标志,读到该标志为1,则终止应用程序执行或进入睡眠。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
小海豚 + 2 很给力!
地板
Rain_King| | 2013-10-9 17:47 | 只看该作者
楼上的是解决办法,总之来说就是 要有一个数据存储的....每开机一次就+1,然后与自己设计好的次数进行对比.....

使用特权

评论回复
5
ZG11211| | 2013-10-9 19:23 | 只看该作者
单机有用,量产的话,只要找几片分别试1~n次再读出比较就没戏了,除非能让编译后的BIN文件不以明文方式显现出来。如果是非破坏的读取,一片就搞定。

使用特权

评论回复
6
小海豚|  楼主 | 2013-10-10 14:55 | 只看该作者
yewuyi 发表于 2013-10-9 15:53
使用带内部EEPROM或者支持FLASH自擦写的MCU。

做一个标志,运行3次后就将该标志置位并写入EEPROM或者FLASH ...

那这段代码是什么意思 能给我详细说明下吗?谢谢
struct pin_str {
        char pinbuf[7];       
        unsigned char nstart;
        unsigned char set_pin;
        unsigned int pincrc;
};
unsigned int crc_cal(unsigned char *databuf, unsigned char lenth)//???
{
        int i;
        unsigned int crc_value = 0xffffu;

        while (lenth--) {
                crc_value ^= *databuf++;
                for(i=0; i<8; i++)
                {
                        if(crc_value & 0x0001u)
                                crc_value = (crc_value>>1)^0xa001;
                        else
                                crc_value = crc_value >> 1;
                }
        }
        return(crc_value);
}
unsigned char wt_eedata(unsigned int addr, unsigned char *pbuf, unsigned char len)
{
        unsigned char i;
        unsigned int tmpaddr;

        ClrWdt();
        tmpaddr = addr;
        for(i=0;i<len;i++)
        {
                if(!WTE2ROM(tmpaddr, *pbuf))
                        return(ERR);
                pbuf += 1;
                tmpaddr += 1;
        }
        return(OK);
}
void rd_eedata(unsigned int addr, unsigned char *pbuf, unsigned char len)
{
        unsigned char i;
        unsigned int tmpaddr;

        ClrWdt();
        tmpaddr = addr;
        for(i=0;i<len;i++)
        {
                *pbuf++ = RDE2ROM(tmpaddr);
                tmpaddr += 1;
        }
}
#if PIN_SET
void save_pin(void)
{
        pin_str.pincrc = crc_cal((unsigned char *)&pin_str, sizeof(pin_str)-2);//??
        wt_eedata(EE_ADDR_PIN, (unsigned char *)&pin_str, sizeof(pin_str));
}
void ini_pin(void)
{
        pin_str.set_pin = NO_PIN;
        pin_str.nstart = 1;
        memcpypgm2ram((void *)pin_str.pinbuf, (rom void*)def_pin,PIN_NBITS);
        save_pin();
}
void rd_pin(void)
{
        rd_eedata(EE_ADDR_PIN, (unsigned char *)&pin_str, sizeof(pin_str));
        if(crc_cal((unsigned char *)&pin_str, sizeof(pin_str)-2) != pin_str.pincrc)
        {
                ini_pin();
        }
}
#endif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

37

帖子

0

粉丝