gpt4 book ai didi

c# - 在 c# 中使用 WinSCard API 读/写 SLE4442 存储卡

转载 作者:可可西里 更新时间:2023-11-01 07:58:28 29 4
gpt4 key购买 nike

一些背景信息:

为了读取/写入 SLE4442 存储卡,我的应用目前正在使用 Omnikey Cardman 3021 USB 读卡器,一个能够包装 CT-API 调用(定向到 omnikey 的 dll)的 Sumbsembly Smartcard API(外部 dll),因此我可以在我的 c# 应用程序中读/写存储卡。这里唯一的问题是 Omnikey 仅提供其 CT-API 的 32 位 dll。我问他们是否要生产 64 位版本,但他们不介意。

现状:

为了使我的应用程序支持 64 位,我必须使用 Windows WinSCard API 重写它。这里的问题是网络上没有具体的例子如何去做。掌握有效的 APDU 命令几乎是不可能的,但我已经设法获得了两个略有不同的版本。在过去的几个月里,我已经用谷歌搜索了一百次,通过我拼命拼凑的内容,我终于可以读取 SLE4442 存储卡了。但是我这辈子都无法通过写作来工作。

代码:

我不会将整个代码发布到第一篇文章中(如果需要,我可以稍后发布或提供源代码链接)。但我将概述基本步骤。

1) SCardEstablishContext

2) 通过SCardListReaders获取读卡器名称

3)SCardConnect

4) 使用 SCardTransmit 和 APDU new byte[] { 0xFF, 0xB0, 0, 0, 0 } 读取整个内存;

5) 使用 SCardTransmit 和 APDU new byte[] { 0xFF, 0x20, 0, 0, 3, 0xFF, 0xFF, 0xFF } 验证引脚; (请注意,这确实会返回 0x90;0x00 作为响应,这意味着验证应该已经成功)

6) 尝试用 ScardTransmit 和 APDU new byte[] { 0xFF, 0xD6, 0, 0, 50, 1 } 写入; (尝试在内存位置 50 处写入值 1)- 我还尝试使用第一个参数为 0x00 和/或第二个字节为 0xD0 的 APDU。响应从来都不是 0x90;0x00,所以我假设在写入过程中出现错误,但我无法找到返回的错误代码的任何含义。

可能的原因:

因为我可以使用 WinSCard API 读取存储卡,所以它也必须可以写入一个(旁注 - 我尝试写入的存储卡处于工作状态,我还没有通过 3 次验证 PIN 码失败将其锁定)。

1) 可能write APDU命令有误。可能是指令字节(第二个字节)不正确,或者内存位置使用了某种扩展编码方案。

2) verify 命令可能并没有实际验证。因为命令本身没问题,这就是返回 0x90 的原因,但我必须先调用或设置一些东西。

3) 只是一种预感,但我认为这才是真正的罪魁祸首。在谷歌搜索时,我确实发现了一些模糊的引用,提到必须使用参数 IOCTL_SMARTCARD_SET_CARD_TYPE 调用 SCardControl 方法并将卡类型设置为 SLE4442。但是在任何地方都没有工作示例,我的反复试验导致失败。我收到“无法正确解释一个或多个提供的参数。”以及其他一些错误消息,不记得它们都是什么。假设我从 google code 复制粘贴的代码对错误代码有正确的描述。

我需要什么:

我需要的是有人发布或引导我到一个站点,该站点具有使用 WinSCard API 读/写 SLE4442 的 c# 完整+工作代码,并且它必须在 32 位和 64 位环境中工作。该代码不一定是万无一失的-例如。很好地处理每一种可能的错误情况。我自己应该可以做到。但如果它是(包括 APDU 命令结果描述——例如 0x90;0x00 是成功,但 0x6B;0x4D 是……等等……)那就更好了。

最佳答案

在您的示例中,用于写入卡的 APDU 应该是:

FF D6 00 50 01 01

关于c# - 在 c# 中使用 WinSCard API 读/写 SLE4442 存储卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250905/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com