5443|11

77

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

各位大哥,请帮我看看这个 IC 卡(SLE4442卡)问题啊?谢谢 [复制链接]

1:
向 IC 卡里写数据
是不是必须通过效验了才能写啊?

2:
效验
到底是效验什么东西?
是密码,还是?

3:
假设有人自己做个写卡器,
想卡里写个很大的数据,
然后做到您的读卡器里读
这样,就不行了
怎么防止这样的情况啊
是不是在卡里的某个地方做了
一个标记


4:
SLE4442卡 分区的吗?



#include

#include
#include
#include
#include

#include

sbit SPK                =        P3^4;                //蜂鸣器
sbit LED                =        P3^5;                //指示灯

void delay_ms(unsigned int ms)
{
        unsigned char i;
        while(ms--)
        {
                i=112;
                while(i--);
        }

}

void printchar(unsigned char ch)
{
        if(ch>=0&&ch<=9) ch=ch+'0';
        else if(ch>=10&&ch<=15) ch=ch+'A'-10;
        putchar(ch);
}

void printhex(unsigned char hex)//以十六进制格式输出1个字节
{
        unsigned char c;
        c=hex;
        c=c>>4;
        printchar(c);
        c=hex;
        c=c&0x0F;
        printchar(c);
}

void init(void)
{
        LED=0;
        SPK=0;

        TMOD=0x21;
        TH1=0xFD;
        SCON=0x50;
        PCON=0x00;
        TR1=1;
        TI=1;
        //EA=1;

        CARD_IN=1;
        printf("程序开始运行...\n");

        delay_ms(300);
        LED=1;
        SPK=1;
}

main()
{
        unsigned char i;
        unsigned int p;
        unsigned char buff[16];
        unsigned char pwd[3];

        init();

        for(;;)
        {
                while(CARD_IN);                        //等待插入IC卡
                delay_ms(5);                        //防抖动
                if(CARD_IN) continue;

    //-----------------------------IC 卡已经插入------------------------------------
                LED=0;                                        //打开绿灯
                SPK=0;
                printf("IC卡已插入\n");

                delay_ms(100);
                SPK=1;
                delay_ms(30);

                ResetCard();
                printf("IC卡数据:\n");
                p=0;
                while((!CARD_IN)&&(p<256))
                {
                        //读16字节
                        ReadMainMem(p,buff,16);  //读IC卡主存
                        BreakOperate();
                        Delay10us();
                        printhex(p);
                        printf(": ");
                        for(i = 0;i <= 15; i++)
                                printhex(buff);
                        printf("\n");
                        p+=16;
                }
               
                printf("保护寄存器: "); //读保护存储器
                ReadProtectMem(buff);
                for(i = 0;i < 5; i++)
                        printhex(buff);
                printf("\n");

                //检查密码寄存器
                printf("密码寄存器: ");
                ReadPwd(buff);     //读密码存储器
                for(i = 0;i < 4; i++)
                        printhex(buff);
                printf("\n");

                if((buff[0] & 0x07) == 0x07)                //密码计数,防止3次校验错误密码导致锁卡
                {
                        //出厂默认密码
                        pwd[0]=0xFF;
                        pwd[1]=0xFF;
                        pwd[2]=0xFF;
                        if(Verify(pwd))                //校对密码
                        {
                                printf("校对密码正确\n");

                                //写0x30开始的16个字节
                                for(i=0x30;i<0x40;i++)                       
                                {
                                        buff[0]=i;
                                        WriteMainMem(i,buff);                //写一字节
                                }
                                printf("写数据成功\n");
                                buff[0]=0x12;
                                buff[1]=0x34;
                                buff[2]=0x56;
                                ChangePwd(buff);
                                printf("密码已修改为:0x123456\n");
                        }
                        else
                        {
                                printf("校对密码出错\n");
                        }
                }
                else
                {
                                printf("密码计数器不是 111\n");
                }

                if(!CARD_IN)
                        ResetCard();


                while(!CARD_IN);                //等待拨出IC卡
                //-----------------------------IC 卡已经插入------------------------------------
               
               
                //-----------------------------IC 卡退出----------------------------------------
                LED=1;                                        //关闭绿灯
                printf("IC卡已退出\n");
                delay_ms(30);
                //-----------------------------IC 卡退出----------------------------------------
        }
}


5:
buff[0]=0x12;
buff[1]=0x34;
buff[2]=0x56;
ChangePwd(buff);

这里已经把密码都改了

为什么
pwd[0]=0xFF;
pwd[1]=0xFF;
pwd[2]=0xFF;
if(Verify(pwd))                //校对密码
{
        printf("校对密码正确\n");
}

为什么 用 ff ff ff 还效验正确?



谢谢!

最新回复

大哥 还在线吗?   详情 回复 发表于 2008-2-20 14:00
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1、要写数据必须先验证。一次验证的有效期为断电前。
2、验证卡的密码,3字节长度。
3、你的卡和别人做的卡,密码不同,别人的卡在你的读卡器里面不能用;还有,可以对卡里的有效数据进行一些类似加密的
处理。
4、不分区。前面是厂家代码空间。从20H开始是用户自由使用空间吧。结束于FFh地址


谢谢大哥,还有几个地方不懂:

1:
一次验证的有效期为断电前。
这个是什么意思啊?

2:
效验,是效验卡的密码,是吗?
密码检查和效验有什么区别?

3:
你的卡和别人做的卡,密码不同,别人的卡在你的读卡器里面不能用

可是在密码检查前,能够读出卡的全部内容啊
说明别人的卡在我读卡器里是可以读的,是吗?
知识写的话,需要先效验密码,是吗?

4:
分辨是不是本公司发出的卡,只能靠密码的不同来区分,是不?

5:
还有,可以对卡里的有效数据进行一些类似加密的处理。

加了密的话,可以读取出来吗?
如果读取不出来,那不是这些数据都木用了?

6:
if((buff[0] & 0x07) == 0x07)        //密码计数,防止3次校验错误密码导致锁卡
        {
            //出厂默认密码
            pwd[0]=0xFF;
            pwd[1]=0xFF;
            pwd[2]=0xFF;
            if(Verify(pwd))        //校对密码
            {
                printf("校对密码正确\n");

                //写0x30开始的16个字节
                for(i=0x30;i<0x40;i++)            
                {
                    buff[0]=i;
                    WriteMainMem(i,buff);        //写一字节
                }
                printf("写数据成功\n");
                buff[0]=0x12;
                buff[1]=0x34;
                buff[2]=0x56;
                ChangePwd(buff);
                printf("密码已修改为:0x123456\n");
            }
            
            
这一段我看不明白,
这里不是修改密码为 0x123456 了吗?
为什么效验还是用

pwd[0]=0xFF;
pwd[1]=0xFF;
pwd[2]=0xFF;

呢?


我把卡插进去,然后退出,重复了好几遍啊?


谢谢!
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
我把插入退出 2 次
打印的信息是:
IC卡已插入
IC卡数据:
00: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
10: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
20: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
30: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
40: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
50: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
60: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
70: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
80: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
90: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
A0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
B0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
C0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
D0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
E0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
F0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
保护寄存器: FFFFFFFFFF
密码寄存器: FFFFFFFF
校对密码正确
写数据成功
密码已修改为:0x123456
IC卡已退出
IC卡已插入
IC卡数据:
00: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
10: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
20: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
30: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
40: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
50: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
60: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
70: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
80: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
90: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
A0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
B0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
C0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
D0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
E0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
F0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
保护寄存器: FFFFFFFFFF
密码寄存器: FFFFFFFF
校对密码正确
写数据成功
密码已修改为:0x123456


请教:
密码寄存器: FFFFFFFF
的值为什么是 FFFFFFFF 啊?
不是说 密码存储区,第一字节为密码计数,其它三字节为密码
那么密码计数应该是 0x03 啊
第二次的密码应该是 0x123456 了啊?


为什么结果是这样的啊?
谢谢!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
1:
一次验证的有效期为断电前。
这个是什么意思啊?
这个简单,因为卡会用变量记住用户获得的权限,当断电后再加电,变量被重新初始化,无论这个已取得的权限是在RAM中还是在FLASH中,加电后卡都会将其置0.
2:
效验,是效验卡的密码,是吗?
密码检查和效验有什么区别?
校验不是效验,密码检查就是校验,用来让用户取得一定的权限,比如手机卡可以设置使能CHV1,这样开机的时候就要您输入PIN1,输不对就不能使用。
3:
你的卡和别人做的卡,密码不同,别人的卡在你的读卡器里面不能用

可是在密码检查前,能够读出卡的全部内容啊
说明别人的卡在我读卡器里是可以读的,是吗?
知识写的话,需要先效验密码,是吗?

读与写的权限是可以不同的,不同文件的读写也可以不同的,一般读的权限远低于写的权限。
4:
分辨是不是本公司发出的卡,只能靠密码的不同来区分,是不?

卡都有ATR吧,用ATR可以做其他判断

5:
还有,可以对卡里的有效数据进行一些类似加密的处理。

加了密的话,可以读取出来吗?
如果读取不出来,那不是这些数据都木用了?

能不能读出来跟是否加密无关,只与你获得的权限有关
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
ChangePwd是否执行成功了,你判断了吗?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
太感谢大哥了,读写卡现在可以了

但是又碰到了个奇怪的问题:

#include

#include
#include
#include
#include

#include

sbit SPK        =    P3^4;        //蜂鸣器
sbit LED        =    P3^5;        //指示灯

void delay_ms(unsigned int ms)
{
    unsigned char i;
    while(ms--)
    {
        i=112;
        while(i--);
    }

}

void printchar(unsigned char ch)
{
    if(ch>=0&&ch<=9) ch=ch+'0';
    else if(ch>=10&&ch<=15) ch=ch+'A'-10;
    putchar(ch);
}

void printhex(unsigned char hex)//以十六进制格式输出1个字节
{
    unsigned char c;
    c=hex;
    c=c>>4;
    printchar(c);
    c=hex;
    c=c&0x0F;
    printchar(c);
}

void init(void)
{
    LED=0;
    SPK=0;

    TMOD=0x21;
    TH1=0xFD;
    SCON=0x50;
    PCON=0x00;
    TR1=1;
    TI=1;
    //EA=1;

    CARD_IN=1;
    printf("程序开始运行...\n");

    delay_ms(300);
    LED=1;
    SPK=1;
}


void ComInStr() interrupt 4 //串行口中断
{
    /*
   if(RI)
     {
          if (ReceiveCount > 4)   //从电脑接收 3 个字符
           {
                    ReceiveCount = 0;        
             }
         ReceiveBuf[ReceiveCount] = SBUF; //用来接收电脑发过来的字符
           ReceiveCount++;                  //串口接收的字符个数
         if (ReceiveCount > 4)
               {
                ReceiveFlag = 1; //接收标志置位 表示是否接收完了
              }
         RI=0;
     }//if(RI)
     */
}


main()
{
    unsigned char i;
    unsigned int p;
    unsigned char buff[16];
    unsigned char pwd[3];

    init();

    for(;;)
    {
        while(CARD_IN);            //等待插入IC卡
        delay_ms(5);            //防抖动
        if(CARD_IN) continue;

    //-----------------------------IC 卡已经插入------------------------------------
        LED=0;                    //打开绿灯
        SPK=0;
        printf("IC卡已插入\n");

        delay_ms(100);
        SPK=1;
        delay_ms(30);

        ResetCard();
        printf("IC卡数据:\n");
        p=0;
        while((!CARD_IN)&&(p<256))
        {
            //读16字节
            ReadMainMem(p,buff,16);  //读IC卡主存
            BreakOperate();
            Delay10us();
            printhex(p);
            printf(": ");
            for(i = 0;i <= 15; i++)
                printhex(buff);
                /*
                {
                    SBUF = '1';
              while(!TI);
              TI=0;   
            }
            */
            printf("\n");
            p+=16;
        }
        
        printf("保护寄存器: "); //读保护存储器
        ReadProtectMem(buff);
        for(i = 0;i < 5; i++)
            printhex(buff);
        printf("\n");

        //检查密码寄存器
        printf("密码寄存器: ");
        ReadPwd(buff);     //读密码存储器
        for(i = 0;i < 4; i++)
            printhex(buff);
         printf("\n");

        //if((buff[0] & 0x07) == 0x07)        //密码计数,防止3次校验错误密码导致锁卡
        //{
            //出厂默认密码
            //pwd[0]=0xFF;
            //pwd[1]=0xFF;
            //pwd[2]=0xFF;
        if((buff[0] & 0x07) == 0x07)
      {
        pwd[0]=0x12;
          pwd[1]=0x34;
          pwd[2]=0x56;

            if(Verify(pwd))        //校对密码
            {
                printf("校对密码正确\n");

                //写0x30开始的16个字节
                for(i=0x30;i<0x40;i++)            
                {
                    buff[0]=i;
                    WriteMainMem(i,buff);        //写一字节
                }
                printf("写数据成功\n");
                buff[0]=0x12;
                buff[1]=0x34;
                buff[2]=0x56;
                ChangePwd(buff);
                printf("密码已修改为:0x123456\n");
            }
            else
            {
                printf("校对密码出错\n");
            }
        }
        else
        {
                printf("密码计数器不是 111\n");
        }

        if(!CARD_IN)
            ResetCard();


        while(!CARD_IN);        //等待拨出IC卡
        //-----------------------------IC 卡已经插入------------------------------------
        
        
        //-----------------------------IC 卡退出----------------------------------------
        LED=1;                    //关闭绿灯
        printf("IC卡已退出\n");
        delay_ms(30);
        //-----------------------------IC 卡退出----------------------------------------
    }
}


则打印的信息:

IC卡已插入
IC卡数据
00: A2131091FFFF8115FFFFFFFFFFFFFFFF
10: FFFFFFFFFFD27600000400FFFFFFFFFF
20: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
30: 303132333435363738393A3B3C3D3E3F
40: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
50: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
60: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
70: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
80: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
90: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
A0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
B0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
C0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
D0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
E0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
F0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
保护寄存器: FFFFFFFFFF
密码寄存器: 07000000
校对密码正确
写示成功
密码已修改为:0x123456



如果:
while((!CARD_IN)&&(p<256))
        {
            //读16字节
            ReadMainMem(p,buff,16);  //读IC卡主存
            BreakOperate();
            Delay10us();
            printhex(p);
            printf(": ");
            for(i = 0;i <= 15; i++)
                //printhex(buff);
               
                {
                    SBUF = '1';
              while(!TI);
              TI=0;   
            }
            
            printf("\n");
            p+=16;
        }
        
        

则打印的是:
IC卡已插入
IC数据
00:1111111111111111

为什么不能打印 256 个 1

为什么
p 都不下移了呢?

谢谢!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
你不是p += 16吗?很快就超过256了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
可是为什么
printhex(buff);
能正常打印出来啊

大哥,可以用 QQ 聊聊吗?
QQ:19335776
谢谢!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
  1. while((!CARD_IN)&&(p <256))
  2. {
  3.         //读16字节
  4.         ReadMainMem(p,buff,16);     //读IC卡主存
  5.         BreakOperate();
  6.         Delay10us();
  7.         printhex(p);
  8.         printf(":   ");
  9.         for(i   =   0;i   <=   15;   i++)
  10.                 //printhex(buff[i]);
  11.        
  12.         {
  13.                 SBUF   =   '1';
  14.                 while(!TI);                         //这后面多了一个;
  15.                         TI=0;         
  16.         }
  17.        
  18.         printf("\n");
  19.         p+=16;
  20. }
复制代码
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
俺想错了,上面没多那个;
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
我仔细想了想,也觉得应该输出256个啊。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
大哥
还在线吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表