制作一个基于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:山东
783712
腐蚀的效果比雕刻还容易控制
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
光谱
9年5个月前 IP:山东
783716
[s::funk:]摸语.......原来USB口里面是24C啊....热转印的不错....看PCB我还以为逗语放了个8Pin的Attiny进去 ...还在想怎么昨天还在群里问24C今天就玩起USB了....
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
samsun185
9年5个月前 IP:山东
783717
如果写入密码计算公式,我复制成功了,在你使用之前我使用了一次,那么,复制品就成了合法的了。
你那个原装的就废了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
无语·回忆作者
9年5个月前 IP:山东
783718
引用 samsun185:
如果写入密码计算公式,我复制成功了,在你使用之前我使用了一次,那么,复制品就成了合法的了。
你那个原装的就废了。
嗯,确实存在这个问题,如果加一个指纹解锁搭配使用,应该就可以了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
光谱
9年5个月前 IP:山东
783719
引用 无语·回忆:
嗯,确实存在这个问题,如果加一个指纹解锁搭配使用,应该就可以了
[s::D]所以说你还是放个ATtiny进去根据某种算法计算动态密钥比较好
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
20!Dopaminor
9年5个月前 IP:广东
783720
引用 张静茹:
腐蚀的效果比雕刻还容易控制
哪个芯片制造还用雕刻
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1452951280
9年5个月前 IP:四川
783722
这样也行?好吧,膜拜
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
山猫
9年5个月前 IP:甘肃
783793
唔~~~无语做的不错
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
飞线大师
9年5个月前 IP:内蒙古
783797
那个,可以加一个识别电路,正常正负极就是U盘,对调正负极就是密钥。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
成飞秋山澪
9年5个月前 IP:山东
783804
做的还不错啊。。。。。我还以为那是个真的U盘。。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
熊猫阿Bo
9年5个月前 IP:德国
783885
建议楼主参考一下NIST的FIPS-140
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
PCBBOY1991
9年5个月前 IP:广东
783943
我说怎么可以通过USB信号操作EEPROM。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ksws0263785
9年5个月前 IP:广东
783965
i2c还可以改进,可以一次写入多个数据,但是要注意 换页。这个可以看芯片的数据手册。

算法你可以参考 双因素认证 。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
好大一菇凉
9年5个月前 IP:河北
783991
过硫酸钠+硫酸铜
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
好大一菇凉
9年5个月前 IP:河北
783992
引用 好大一菇凉:
过硫酸钠+硫酸铜
也可能是过硫酸铵
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
laji3865689
9年5个月前 IP:浙江
784028
青猫摸语。
还以为你要做电脑版的,正纳闷电脑软件是什么呢。
如果只是作为单片机系统的钥匙,USB口并不是最佳选择,RFID才是王道。但是RFID太常见,B格又降低不少。
可以考虑拆个内存条插槽来用,钥匙也做成内存条的形状。金手指多得匪夷所思,完全可以用上单片机的所有I/O口来做并行通讯,协议自定。
一种设想:使用单片机所有模拟输入口,每个口接收特定频率的PWM信号,这些由钥匙发出的信号会模拟一段音乐,例如:
2212445
221211
2212456
656542
2212445
...
每个数字代表一个模拟通道,并对应某个特定频率,如“1”就是“哆”
钥匙储存1分钟的音乐,每次随机播放3秒,单片机锁根据音符的前后顺序来判断是否真钥匙。
这样的神经病密码,只有哈士奇能破解。
引用
评论
3
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
电妖妖
9年5个月前 IP:湖南
784150
,,硬件加密芯片如何,,只听说过,没见过
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rb-sama
9年5个月前 IP:北京
784197
最近也在搞单片机系统加密的东西!
这个思路很不错哦。但是如果密钥和系统都给客户的话。
有没有什么好的方法来加密呢?

现在芯片破解商家的技术能做到模拟外界接口的通信流。
用加密芯片是个不错的选择。
但是如果能利用单片机自身的唯一ID号生成动态密码,有什么好的算法可以借鉴嘛?

可以让复制二进制码的山寨厂家,烧录进单片机。通过对比ID号实现IAP自擦除FLASH内容。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士
9年4个月前 IP:澳大利亚
787094
有给很吊的想法 用18B20来做加密,装在一个耳机插头里,正好3个脚,18b20里面有ID呢而且是唯一的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Aromatisation
5年4个月前 IP:广东
861623
引用laji3865689发表于16楼的内容
青猫摸语。还以为你要做电脑版的,正纳闷电脑软件是什么呢。如果只是作为单片机系统的钥匙,USB口并不是...

有意思

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Aromatisation
5年4个月前 IP:广东
861624
引用金坷居士发表于19楼的内容
有给很吊的想法 用18B20来做加密,装在一个耳机插头里,正好3个脚,18b20里面有ID呢而且是唯...

有一种东西叫做硅序列号

可以百度一下,就是一个小芯片,3个引脚,里边有一个唯一的48位二进制序列号,不可修改

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
qiuzheru
5年4个月前 IP:江西
861695

不如参考那些专门做加密狗的公司的方案,国内的深思、飞天,国外的Wibu,Gemalto等等。最好可以将需要保护的程序的部分关键计算代码内置在硬件中,或者至少部分关键数据在加密狗内解密。比如用Gemalto/Sentinel HASP的 hasp_decrypt解密每一组关键数据,有一款软件将它保存文件的格式定义加密,如果没有加密狗,就算其他验证都被绕过,也无法正确读取保存文件。软件本身也要最好要加外壳保护。用的单片机最好是安全型的,否则有能力的人导出固件,往IDA里一拖,你就就完蛋了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zylinux
5年4个月前 IP:美国
861702

真的很逗的东西很好玩 鼓励一下


引用
评论
加载评论中,请稍候...
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)}}