我想检测智能卡的状态,看看是否有卡插入或拔出,
为此我在这里使用了智能卡读取代码
我发现该SCardGetStatusChange功能可以检测到,但不知道如何使用。这是我的添加代码
[DllImport("winscard.dll")]
public static extern int SCardGetStatusChange(int hContext,uint dwTimeout,[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)]SCARD_READERSTATE[] rgReaderState,uint cReaders);
public struct SCARD_READERSTATE
{
[MarshalAs(UnmanagedType.LPTStr)]
public string szReader;
public IntPtr pvUserData;
public uint dwCurrentState;
public uint dwEventState;
public uint cbAtr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
public byte[] rgbAtr;
}
SCARD_READERSTATE[] rs = new SCARD_READERSTATE[1];
rs[0].szReader = ReaderList;
rs[0].dwCurrentState = SCARD_STATE_UNAWARE;
int result = SCardGetStatusChange(ContextHandle, 1000, rs, 2);
Run Code Online (Sandbox Code Playgroud)
但结果总是一样,我不知道什么是错误的参数。
我知道 SIM 卡在电气上只是一张智能卡,但为了更集中我的问题,如果编程正确,我可以使用任何带有触点的智能卡吗?软件是使 SIM 卡成为智能卡的唯一因素吗?我知道我可以把塑料切掉,这不会影响芯片本身。是否首先加载专有代码?
我正在尝试为我正在开发的专用 LTE 网络编写自己的 SIM 卡。智能卡很便宜,但金雅拓的“SIM”卡就不便宜。我可以很好地使用 pysim,我可以将智能卡插入其中并进城吗?还有很多安全问题,普通智能卡是否满足 SIM 规范?
谢谢,瑞安
我正在尝试构建一个应用程序来读取/编码卡上的数据,如 PAN、到期日、客户名称、PIN 等信息,到目前为止,我发现我需要发送 APDU 命令来从卡读取数据,但似乎有没有明确的文档说明哪些命令用于什么目的以及按什么特定顺序使用,我无法找到 Mastercard/VISA 的规范。有什么文档可以参考吗?
谢谢,空
问题1.当 SIM 制造商对 SIM 卡进行个性化处理,然后移动运营商将其交给最终用户时,GlobalPlatform (GP) 密钥(ENC、MAC、KEK...)是否有任何用途?
只要我知道 SIM 文件结构或其小程序可以通过 OTA RFM 和 RAM 访问(KID/KIC/KIK)。因此,当 SIM 到达客户手中时,无需拥有 GP 密钥。
是否有什么特殊的地方(例如,在 OTA 交互过程中,我们是否需要 GP 密钥)?正如我所理解的,当我们物理上可以访问 SIM 卡并且可以直接向 SIM 卡发送 APDU 时,GP 密钥就可用。我对吗?
问题2。是否可以使用全局平台命令(例如是否可以读取记录、读取二进制)使用 GP 密钥访问 SIM/USIM 文件结构并访问 ISD 拥有的权限?通常,可以使用 PIN 和 ADM 密钥根据 3GPP TS 51.011/ETSI TS 151 011 中定义的访问条件来访问文件结构。但是是否可以使用 ISD 拥有的 GP 密钥和访问权限?
我正在使用Microsoft SmartCard API开发SCM非接触式RFID读卡器。
据我所知,惯用智能卡的通常过程是:
1.使用SCardEstablishContext()建立上下文
2. 使用SCardListReaders()列出连接到系统的所有读取器
3.选择一个读取器并等待卡插入其中。
4.一旦检测到卡,函数SCardGetStatusChange()将返回。
5.使用SCardConnect()通过选定的读取器连接至卡。6
.使用SCardTransmit()与卡进行通话
直到5的所有步骤都可以正常工作,这意味着我拥有正确的卡手柄。可以通过发出返回协商协议的SCardStatus()函数和卡的ATR来进一步验证卡。但是,当我尝试使用SCardTransmit()发送任何APDU命令时,它将返回错误(错误代码14,我猜是SCARD_E_CANT_DISPOSE)。
我不知道出什么问题或缺少什么。我通过发出{0xFF,0xCA,0x00、0x00、0x00}尝试了不同的APDU,例如非常基本的APDU来读取卡UID。我使用SCM TestResMan调试工具验证了此APDU,它向我返回了卡的正确UID。我正在使用MiFARE 1k卡和SCM非接触式SCL011读卡器。
请在下面找到SCardTransmit()代码片段(所有先前的函数返回成功)。
SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;
SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;
byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;
sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将applet(.cap文件)安装到智能卡中.我读过可以使用APDU完成.我使用Netbeans创建了我的applet,它的帮助是// aid/9AE9BE4D27/53.
首先构建apdu,选择installer applet:
0x00 0xA4 0x04 0x00 0X09 0xA0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F;
然后构建apdu,它将创建我的applet(遵循此sctructure):
header: 0x80 0xb8 0x00 0x00
lc aid:
aid:
le: 0x7F;
我开发了一个应用程序,可以使用apdu命令发送到真实卡channel.transmit(new CommandAPDU(apdu).我想如果我发送正确的安装命令,我的.cap文件应该安装在卡中.
有了这些信息,任何人都可以帮我构建正确的apdu,将我的cap文件安装到真实的卡片中吗?
谢谢.
我有PKCS-11支持的智能卡吗?我只想检查我的智能卡是否工作正常。如何在Ubuntu上检查它?请指导我。我可以使用什么软件?我应该怎么做?
我有一张它没有融合的智能卡(我的意思是它没有预先个性化).它有一个ATR = 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2.
Q1:我的卡的历史字节是什么/在哪里?我怎么分析它们?
Q2:哪里可以找到我卡的型号?我在互联网上搜索了它的ATR,但我一无所获!
当您尝试使用诸如GPJ之类的工具列出真空卡的小程序(我的意思是未融合的卡)时,您会收到以下输出:
>> gpj -list
>> java -jar gpj.jar -list
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
Found card in terminal: ACS CCID USB Reader 0
ATR: 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2
DEBUG: Command APDU: 00 A4 04 00 …Run Code Online (Sandbox Code Playgroud) 我有一张Felica卡.第一个问题是这张卡究竟是什么?它是智能卡还是简单的存储卡?它是一种Java卡,我.cap可以在里面加载文件或它有其专有的固定内容,我不能加载任何小程序?是GlobalPlatform标准投诉吗?
我在这里读到:
索尼专有的FeliCa是一种类似于ISO/IEC 14443的智能卡技术.FeliCa具有类似于ISO/IEC 7816-4中定义的文件系统.用于访问文件系统的文件系统和命令在JIS X 6319-4 [28]中标准化.此外,FeliCa系统还具有专有的加密和安全功能.
之后我尝试向它发送一些APDU命令.第一步是与读者进行一些配置更改.因为我的阅读器配置为读取ISO14443 A型和B型卡而不是Felica卡.
由于Felica和ISO/IEC 14443卡都使用13.56 MHz频率作为载波,我认为这些类型之间的差异仅在协议层中.我对吗?如果是这样,Felica卡传输协议的名称是什么?(对于ISO/IEC 14443卡,我们有T = 1和T = CL协议).
配置完阅读器后,我尝试向卡发送命令:
Connect successful.
Send: 00 A4 04 00 00
Recv: 6A 81
Time used: 31.000 ms
Send: 00 C0 00 00 00
Recv: 6A 81
Time used: 28.000 ms
Send: 00 CA 00 00 00
Recv: 6A 81
Time used: 35.000 ms
Run Code Online (Sandbox Code Playgroud)
如上所述,我0x6A81只收到状态字.
我还搜索了很多ACS Reader数据表,一些恩智浦应用笔记以及肯定的JIS X 6319-4标准,以获得此类卡的命令列表.但我发现什么都没有适用.
所以,问题是:
更新: …
我有一个终端,它有自己的API来固定和发送芯片和终端之间的命令,有一个功能,它发送APDU命令并以字节数组返回答案.
例如,如果想要读取标签5A(应用程序PAN),我发送以下命令:
byte[] byteArrayAPDU = new byte[]{(byte)0x00, (byte)0xCA, (byte)0x00, (byte)0x5A};
int nResult = SmartCardInterface.transmit(nCardHandle, byteArrayAPDU, byteArrayResponse);
Run Code Online (Sandbox Code Playgroud)
该变量byteArrayResponse获得对APDU命令的响应.
当我将值转换byteArrayAPDU为十六进制数字字符串时,这给了我:00 CA 00 5A.并且对该命令的响应是6E 00(类不受支持).
我的设备使用ISO 7816作为技术规格.我发送APDU命令的方式是否正确?我问这个是因为我已经读过APDU命令至少必须有5个值,但我不知道在第五个参数中要发送什么.我不知道答案的长度是什么.
您能举例说明如何在APDU命令中获取标签5A或其他内容吗?
如果命令正确,取代我6E 00此刻看到的位置,我会在投射到字符串时将信息看作纯文本吗?