CPU卡FM1208操作

参考https://blog.csdn.net/hongprovelllll/article/details/51354978建立框架

赵同学整理版:

/*********************************************************/

复旦微建议门禁流程

选择主目录:
<- 00A40000023F00
-> 6F10840E315041592E5359532E44444630319000

建立主目录下密钥文件:
<- 80E00000073F006C01FAFFFF
-> 9000
#
《注意:->6892 不满足安全条件 需要先去认证!再回来
	1)获取随机数 0084000004--1807C6A9(务必del9000)
	2)DES加密(单倍)FFFFFFFFFFFFFFFF+1807C6A990000000=>EDF2EA8C1DB789A0
	3)外部认证   0082000008紧跟EDF2EA8C1DB789A0
》
#
写入3F00目录下外部认证密钥
<- 80D401000DF9F0F0AA88FFFFFFFFFFFFFFFF
-> 9000



建立应用目录(ADF):
<- 80E03F010D380600F0FA95FFFF4144463031
-> 9000

选择应用目录3F01:
<- 00A40000023F01
-> 6F07840541444630319000

建立ADF目录下密钥文件:
<- 80E00000073F010095FAFFFF
-> 9000
写入3F00目录下外部认证密钥
<- 80D401000DF9F0F0AA88FFFFFFFFFFFFFFFF
-> 9000

建立应用目录下二进制文件:
<- 80E0000307280010FAFAFFFF
-> 9000

写入二进制文件内容
<- 00D60000081122334455667788
-> 9000

写卡流程:
1、选择主目录(MF 3F00)
2、创建主秘钥(MF)文件(0000)
3、写入秘钥文件

4、创建应用目录(ADF 3F01)
5、创建ADF的秘钥文件(0000)
6、写入秘钥文件

7、创建应用文件
8、写入数据



/*******************读的流程**********************/
选择应用目录3F01:
<- 00A40000023F01
-> 9000


获取自由数:
Send:0084000004
-> 06CEE4F29000

外部认证:
<- 0082000008FEC63184B307AEFD
-> 9000



选择二进制文件03:
<- 00B0830000
-> 112233445566778800000000000000009000


读的流程:
1、选择读的目录
2、外部认证
	1)获取随机数
	2)DES加密
	3)外部认证
3、读取文件

G同学整理版:

整理版:
清除卡片
00A4 000002 3F00//选择主目录3F00
0084 000004 //获取随机数
0082 000008 848BB566915C1F00//外部认证
800E 000000 //擦除卡片
写文件(发卡流程)
00A4 000002 3F00//选择主目录3F00
80E0 000007 3F00 6C01FAFFFF//建立主目录3F00下密钥文件?
80D4 01000D F9F0 F0 AA 88 FFFFFFFFFFFFFFFF//写入主目录3F00下外部认证密钥
80E0 3F010D 3806 00F0FA95FFFF 4144463031//创建ADF文件
00A4 000002 3F01//选择应用目录3F01  或者用另一种方式点名 00A4 040005 4144463031
80E0 000007 3F01 0095FAFFFF//建立ADF3F01目录下密钥文件:
80D4 01000D F9F0 F0 AA 88 FFFFFFFFFFFFFFFF//写入3F00目录下外部认证密钥
80E0 000307 280010FAFAFFFF//建立应用目录下二进制文件
00D6 000008 1122334455667788//XIE
读文件
00A4 000002 3F01//选择应用目录3F01
0084 000004 //获取随机数
0082 000008 848BB566915C1F00//外部认证
00B0 830000 //选择二进制文件03

具体分析1
1->CREAT  
80E0 3F010D 38(DF)         0600(文件空间)F0(读权限)FA(写权限)95(应用文件ID)FFFF 4144463031     //创建ADF文件
80E0 000007 3F(秘钥文件)   006C(文件空间)01(读权限)FA(写权限)              FFFF (秘钥都是FFFF)//建立主目录3F00下密钥文件?
80E0 000307 28(二进制文件) 0010(文件空间)FA(读权限)FA(写权限)              FFFF               //建立二进制文件
说明:创建DF比较特殊 给了ID和DF名称 那么查找它的时候方式有上面的两种 还有一种没有用的就是PDF说的95对应0015
95是--01011111  其实是0015不是95 因为前面的字节不是属于它的
2->WRITE KEY
80D4 01 00 0D F9(强烈推荐的39秘钥现在变异为F9)F0(使用权) F0(更改权) AA(后续状态) 88(错误计数器) FFFFFFFFFFFFFFFF(8字节密码)//写入3F00目录下外部认证密钥      
它是前面已经确定好了文件 现在就是真正的写入  


操作下一篇吧。

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的使用C语言编写的FM1208 CPU和读的代码示例,其中使用了串口通信和APDU指令: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <termios.h> #include <fcntl.h> #include <unistd.h> #define MAX_BUF_LEN 1024 int serialOpen(char *port, int baudrate) { int fd; struct termios newtio; fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY); if (fd < 0) { perror("open"); return -1; } tcgetattr(fd, &newtio); memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = baudrate | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); return fd; } void serialClose(int fd) { close(fd); } int sendAPDU(int fd, unsigned char *apdu, int apduLen, unsigned char *respBuf, int *respLen) { unsigned char buf[MAX_BUF_LEN]; int len; write(fd, apdu, apduLen); len = read(fd, buf, MAX_BUF_LEN); memcpy(respBuf, buf, len); *respLen = len; return 0; } int main(int argc, char **argv) { int fd; unsigned char apdu[256] = {0}; unsigned char respBuf[MAX_BUF_LEN] = {0}; int respLen = 0; // 打开串口 fd = serialOpen("/dev/ttyS0", B9600); if (fd < 0) { printf("open serial port failed\n"); return -1; } // 发送APDU指令 // 发 apdu[0] = 0x00; apdu[1] = 0xA4; apdu[2] = 0x04; apdu[3] = 0x00; apdu[4] = 0x08; apdu[5] = 0xA0; apdu[6] = 0x00; apdu[7] = 0x00; apdu[8] = 0x00; apdu[9] = 0x03; apdu[10] = 0xF0; apdu[11] = 0x01; apdu[12] = 0x01; apdu[13] = 0x05; sendAPDU(fd, apdu, 14, respBuf, &respLen); memset(apdu, 0, sizeof(apdu)); memset(respBuf, 0, sizeof(respBuf)); respLen = 0; // 读 apdu[0] = 0x00; apdu[1] = 0xB0; apdu[2] = 0x00; apdu[3] = 0x00; apdu[4] = 0x08; sendAPDU(fd, apdu, 5, respBuf, &respLen); // 处理片响应 if (respBuf[respLen - 2] == 0x90 && respBuf[respLen - 1] == 0x00) { printf("Read card success\n"); } else { printf("Read card failed\n"); } // 关闭串口 serialClose(fd); return 0; } ``` 需要注意的是,上述代码仅供参考,具体的代码实现需要根据所使用的硬件平台和应用场景进行相应的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值