sam卡、M1卡、PSAM卡、IC卡区别

1、M1卡

M1芯片全称为NXP Mifare1系列,为飞利浦旗下公司恩智浦出品,常用的有S50(容量位1KB)和S70(容量位4KB)两种型号,兼容国产芯片有复旦的M1卡,和华鸿的M1卡。

2、M1卡与CPU卡区别:

CPU卡装有cos,相当于微型计算器,具有数据存储、命令处理以及数据安全保护等功能,CPU卡的动态密钥、密钥存储、交易验证、加密计算由SAM卡完成,安全性比M1卡高,M1卡只采用固定密钥,不支持SAM卡双向认证;CPU卡的容量可以根据需求改变,M1卡不能CPU卡的通信速率最高达到847kbps,M1只能达到106kbps

3、SAM卡

目前SAM卡分了很多种:

PSAM卡:终端安全控制模块,一般用于小额支付扣款中,支持8K和16K字节的EEPROM空间

  • PSAM卡主要内嵌于商用POS,网点终端,直连终端等设备上,具有安全控制管理功能,支持多级发卡机制,适用于多应用环境,与卡片是一对多的关系,完成机具与卡片的双向认证PSAM卡是一种安全模块,用于验证用户卡的合法性,同时保护终端机具的扣款行为。
  • 比如,在公交车上,用于刷卡扣费的车载机具里都有一张PSAM卡,这个PSAM卡和乘客手里的公交卡是一对多的关系,大家只有在公交公司授权的网点买的公交卡,才能乘车;也只有公交公司部署的合法机具才能扣除公交卡里的钱。
  • 从应用的角度来看,终端设备比如说 ATM 机,我们可以把他看作包含 PSAM 才构成整体。而用户卡,对 ATM 机来说,则是外部设备。当需要对用户卡片进行操作的时候,实际上终端设备是交替地访问用户卡和 PSAM,按协议流程来完成安全协议规定的操作。比如说外部认证,是要让卡片确认终端设备的合法性(实质上是检验它是否持有共享的密钥):1 终端设备向用户卡发送取随机数命令,得到一个卡片生成的随机数。2 终端设备向 PSAM 卡发送一个加密命令,使其对上述随机数加密。3 终端设备向用户卡片发送带有上述加密结果(密文)的外部认证命令。用户卡片进行验证后,确定认证是否成功。如果成功,则可以进行后续的安全操作。
  • PSAM卡采用硬件加密,密钥在硬件中生成,而不用在网络上传输。但由此带来的缺点是,虽然最底层一次一密,似乎比较安全,但最重要的主密钥,乃至子密钥在整个过程中都是固定的。

ESAM:厂商(系统)的SAM卡,用于设备的认证,主要应用在水、电、气三表中,为使用IC卡作为预付费的三表提供内置的安全功能,完成表具与IC卡的双向认证,支持0.5K,1K,2K,4K,8K,16K字节

ISAM:用于充值;

在具体的实现中,会比较多样化。例如,有的设备认证并不是用ESAM卡,而是采用专用的模块。这样,就存在一个问题,即密钥用软件实现,可能会存在密钥泄露的问题;一种解决的方法是存储多组密钥,在随机数中指定采用一组密钥。

 

 

好的,下面是将PN532与STM32连接并读取IC卡的基本步骤: 1. 确认PN532设备与STM32设备正常连接,可以使用SPI或者UART通信协议连接,这里以SPI为例。 2. 在STM32中初始化SPI接口,配置SPI的参数,如时钟分频、数据位数等。 3. 根据PN532的通信协议,发送初始化命令以及读取IC卡的命令。 4. 处理PN532返回的数据,获取IC卡的信息。 下面是一个简单的示例代码,可以帮助您开始: ```c #include "stm32f4xx.h" #include "spi.h" #include "delay.h" #define PN532_SPI_CS_PORT GPIOB #define PN532_SPI_CS_PIN GPIO_Pin_12 void PN532_SPI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* Enable SPI clock and GPIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE); /* Configure SPI pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure CS pin */ GPIO_InitStructure.GPIO_Pin = PN532_SPI_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(PN532_SPI_CS_PORT, &GPIO_InitStructure); /* Connect SPI pins to SPI alternate function */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); /* Configure SPI */ SPI_I2S_DeInit(SPI1); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI */ SPI_Cmd(SPI1, ENABLE); /* Set CS pin high */ GPIO_SetBits(PN532_SPI_CS_PORT, PN532_SPI_CS_PIN); } void PN532_SPI_Write(uint8_t* data, uint16_t len) { /* Set CS pin low */ GPIO_ResetBits(PN532_SPI_CS_PORT, PN532_SPI_CS_PIN); /* Send data */ for (uint16_t i = 0; i < len; i++) { SPI_I2S_SendData(SPI1, data[i]); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); } /* Set CS pin high */ GPIO_SetBits(PN532_SPI_CS_PORT, PN532_SPI_CS_PIN); } void PN532_SPI_Read(uint8_t* data, uint16_t len) { /* Set CS pin low */ GPIO_ResetBits(PN532_SPI_CS_PORT, PN532_SPI_CS_PIN); /* Receive data */ for (uint16_t i = 0; i < len; i++) { SPI_I2S_SendData(SPI1, 0xFF); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); data[i] = SPI_I2S_ReceiveData(SPI1); } /* Set CS pin high */ GPIO_SetBits(PN532_SPI_CS_PORT, PN532_SPI_CS_PIN); } void PN532_Reset(void) { uint8_t cmd[] = {0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00}; PN532_SPI_Write(cmd, sizeof(cmd)); delay_ms(10); } void PN532_SAMConfig(void) { uint8_t cmd[] = {0x14, 0x01, 0x00, 0x00, 0x00}; PN532_SPI_Write(cmd, sizeof(cmd)); uint8_t response[] = {0, 0, 0, 0, 0, 0, 0}; PN532_SPI_Read(response, sizeof(response)); delay_ms(10); } uint8_t PN532_InListPassiveTarget(void) { uint8_t cmd[] = {0x4A, 0x01, 0x00}; PN532_SPI_Write(cmd, sizeof(cmd)); uint8_t response[] = {0, 0, 0, 0, 0, 0, 0}; PN532_SPI_Read(response, sizeof(response)); if (response[0] == 0x01 && response[1] == 0x01 && response[2] == 0x00) { return response[4]; } else { return 0; } } int main(void) { PN532_SPI_Init(); PN532_Reset(); PN532_SAMConfig(); while (1) { uint8_t target = PN532_InListPassiveTarget(); if (target) { /* IC卡已经检测到 */ // 处理IC卡信息 } } } ``` 在此示例中,我们使用SPI1作为SPI接口,并将SCK、MISO、MOSI分别连接到PA5、PA6、PA7。CS引脚连接到PB12。您需要根据您的硬件连接来更改这些引脚。 在main函数中,我们首先初始化PN532设备,然后发送PN532的复位命令,并进行SAM配置。然后,在一个循环中,我们一直检测是否检测到IC卡,如果检测到,则处理IC卡信息。 请注意,此示例代码仅用于参考。您需要根据您的具体要求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值