打印

各位大哥,请再帮我看看这个 IC 卡(SLE4442卡)问题啊?谢谢

[复制链接]
3560|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星电灯|  楼主 | 2008-2-18 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1:
向 IC 卡里写数据
是不是必须通过效验了才能写啊?

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

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


4:
SLE4442卡 分区的吗?



#include <REG52.H>

#include <string.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>

#include <SLE4442.h>

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 还效验正确?



谢谢!

相关帖子

沙发
yiz| | 2008-2-18 16:06 | 只看该作者

回复

1:
向 IC 卡里写数据
是不是必须通过效验了才能写啊?---是的
2:
效验
到底是效验什么东西?
是密码,还是?--是3个字节的密码

3:
假设有人自己做个写卡器,
想卡里写个很大的数据,
然后做到您的读卡器里读
这样,就不行了
怎么防止这样的情况啊
是不是在卡里的某个地方做了
一个标记----卡内数据为2进制字节,用户区在所有情况下均可读,在正确校验后可读可写."想卡里写个很大的数据"是什么意思?写进卡内的数据本质上是无所谓很大或很小的,都是一个一个的字节,也就是说关键是要看你怎样组织怎样存放数据.


4:
SLE4442卡 分区的吗?---分区.具体请看datasheet.
 

使用特权

评论回复
板凳
星星电灯|  楼主 | 2008-2-19 08:11 | 只看该作者

谢谢大哥,还是有几个地方不明白

1、要写数据必须先验证。一次验证的有效期为断电前。
2、你的卡和别人做的卡,密码不同,别人的卡在你的读卡器里面不能用;还有,可以对卡里的有效数据进行一些类似加密的
处理。
3.密码核对正确前,全部数据均可读,如果有需要,可对数据进行适当加密。
核对密码正确后可写入或修改数据





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


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

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

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

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

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

5:
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 卡退出----------------------------------------
    }
}

            
            
这一段我看不明白,
这里不是修改密码为 0x123456 了吗?
为什么效验还是用

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

呢?


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


谢谢!

使用特权

评论回复
地板
星星电灯|  楼主 | 2008-2-19 09:20 | 只看该作者

我把插入退出 2 次,串口里打印的信息如下:

我把插入退出 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 了啊?


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

使用特权

评论回复
5
涛行九天| | 2008-2-19 09:36 | 只看该作者

这个sle4442刚好用过

请到www.study-bbs.com 单片机版面置顶贴下载程序,是好用的

使用特权

评论回复
6
星星电灯|  楼主 | 2008-2-19 10:51 | 只看该作者

谢谢,在那里没有找到哦~

http://www.study-bbs.com/index.asp?boardid=2

使用特权

评论回复
7
涛行九天| | 2008-2-19 11:19 | 只看该作者

这个帖子,不过是汇编的,有年头了

http://www.study-bbs.com/dispbbs.asp?boardID=2&ID=16233&page=1

使用特权

评论回复
8
星星电灯|  楼主 | 2008-2-19 15:29 | 只看该作者

谢谢大哥,看了,差不多都懂了~

使用特权

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

本版积分规则

74

主题

121

帖子

1

粉丝