制作一个基于EEPROM的"USB"密钥
无语·回忆2015/08/07极客DIY IP:山东
最近一直在学习单片机C语言,自从看了电影“超能查派”后,就一直想仿制一个里面的那个USB密钥,所以最近研究了下,做出了这么一个东西,经过本作品学到了不少东西


所用单片机:AT89C51
做本作品的用意是来学习I2C通讯,所以程序方面,在网上找了许多类似功能的程序,然后尝试删减修改其功能,比较不同来学习,最终终于实现了想要的功能,也算对I2C有了初步的了解,在此要感谢群友acmilan和张静茹的指导


采用24C08储存密码,然后采用单片机进行读取,对比密码是否符合,考虑到美观问题,所以将此IC封装在了USB插头里,所以得先拆一个USB插头,去除内芯
IMG_8139.jpg



由于手头没有卡尺等精密测量工具,所以用的普通塑料尺进行测量大小及间距
IMG_8140.jpg

IMG_8141.jpg

采用热转印法制作一块PCB
IMG_8142.jpg


IMG_8145.jpg

转印效果还是不错的:
IMG_8146.jpg

腐蚀(使用的TB上买的蓝色环保腐蚀剂,有人说是过硫酸钠,我也不确定):
IMG_8147.jpg


IMG_8148.jpg


IMG_8149.jpg



裁剪成型
IMG_8150.jpg


将所需原件焊上(为避免USB触点氧化,所以需要镀锡,然后进行打磨):
IMG_8151.jpg


装进USB头里,正好:
IMG_8153.jpg


IMG_8154.jpg


用热熔胶填补内部空间:
IMG_8155.jpg

找个塑料盖套上,美观些:
IMG_8156.jpg


IMG_8157.jpg

哥俩好在内部粘接
IMG_8158.jpg



成品:
IMG_8167.jpg



实验后反思:本密钥虽然起到了鉴权的功能,但是存在被复制的风险,所以打算在程序里加一个密码计算公式,每次解锁成功后计算一个新密码写入到密钥里的EEPROM里供下次解锁使用,这样复制者即使复制了密码也没有太大用处了,况且复制者不可能每次都得逞,有大数据来计算公式,所以打算按照这个想法继续改进下。

将PCB上的正负极调换一下可以做到如果插到普通USB口上就自动销毁的目的


效果视频:







点击此处查看视频


源程序:

<code class="lang-cpp">#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define bool int
#define false 0
#define true 1
       
sbit scl=P2^6;
sbit sda=P2^7;
sbit OUT=P1^1;
       
       
       
void delayus()  
{  
                       
}  
       
void delayXms(uchar x)         
{
 uchar i;
 while(x--)
 {
  for(i=250;i>0;i--)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 } 
}
       
void iic_start() 
{  
    sda=1;  
    scl=1;  
    delayus();      
    _nop_();           
    sda=0;         
    delayus();     
}  
         
void iic_stop()   
{  
    sda=0;_nop_();    
    scl=1;  
    delayus();      
    sda=1;          
    delayus();     
                                 
}  
         
void iic_sendByte(uchar byteData) 
{  
    uchar i;  
    uchar temp=byteData;  
    for(i=0;i<8;i++)       {           temp="temp<<1;  "         scl="0;          "         _nop_();                 sda="CY;        "         _nop_();           _nop_();               }                scl="0;            "     _nop_();                       sda="1;            "     _nop_();   }   uchar iic_readbyte() {       uchar i,temp;       for(i="0;i<8;i++)  "         delayus();                                                  delayus();             return temp;                 bool iic_checkack() errcounts="255;"            while(sda)           if(0="=errCounts)  "         {               scl="0;          "             _nop_();               return false;         }           errcounts--;   true;       void iic_init()       delayus();   iic_sendack(bool b_ack)         if(b_ack)             else             delayus();     at24c02_writebyte(uchar address,uchar databyte)     iic_start();       iic_sendbyte(0xa0);     iic_checkack();         iic_sendbyte(address);       iic_checkack();       iic_sendbyte(databyte);     iic_stop();       delayxms(2);                } at24c02_writedata(uchar numbytes,uchar* buf) 写入任意长度数据       while(numbytes--)           at24c02_writebyte(address++,*buf++);   at24c02_readdata(uchar beginaddr,uchar datasize,uchar* 读取任意长度字节       iic_start();                       iic_sendbyte(0xa0);             iic_checkack();                 iic_sendbyte(beginaddr);       iic_checkack();                     iic_start();                   iic_sendbyte(0xa1);           iic_checkack();               while(datasize--)                     *buf++="iic_readByte();  "         iic_sendack(datasize);       iic_stop();                     main() {   unsigned char temp1[3]="{18,17,16};" temp2[3]="{0};"   iic_init();   at24c02_writedata(0x00,sizeof(temp1),temp1);   delayxms(5);   at24c02_readdata(0x00,sizeof(temp2),temp2);   while(1)   {       if(temp2[0]="=18|temp2[1]==17|temp2[2]==16)"            out="0;"   } }< code></8;i++)  ></intrins.h></reg51.h></code>

[修改于 9年5个月前 - 2015/08/08 09:47:55]

来自:综合交流区 / 极客DIY
24
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
无语·回忆 作者
9年5个月前 IP:山东
783718
引用 samsun185:
如果写入密码计算公式,我复制成功了,在你使用之前我使用了一次,那么,复制品就成了合法的了。
你那个原装的就废了。
嗯,确实存在这个问题,如果加一个指纹解锁搭配使用,应该就可以了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
无语·回忆
进士 机友 笔友
文章
21
回复
584
学术分
0
2012/10/06注册,1个月13天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}