通过脚本更改金雅拓智能卡的PIN码

时间:2015-05-27 19:07:51

标签: smartcard gemalto

我们必须使用Gemalto IDPrime .Net卡智能卡。我们得到这些USB Dongles并且必须更改PIN。

金雅拓通过Windows说:

From the Start menu, choose Run and type PINTool.
Insert a IDPrime .Net card in the reader as prompted, and click OK. The change PIN interface appears
Enter the old PIN (the default PIN value is 0000), the new PIN and confirm the new PIN.
Click on Change Pin
     

http://support.gemalto.com/index.php?id=how_to_change_pin_in_a_idprime#.VWYTWUa8rV8

这有效,但我想通过powershell或c#设置新的PIN /密码,i。即在一个程序的控制下。 怎么做或不可能?

2 个答案:

答案 0 :(得分:3)

您应该能够通过非托管PKCS#11 API更改PIN,这些API可以通过我作为作者的托管.NET包装器Pkcs11Interop从C#轻松访问。

以下是可帮助您入门的代码示例:

using Net.Pkcs11Interop.Common;
using Net.Pkcs11Interop.HighLevelAPI;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // Load PKCS#11 library provided by Gemalto
            using (Pkcs11 pkcs11 = new Pkcs11("gtop11dotnet.dll", true))
            {
                // Find first slot/reader with token/card present
                Slot slot = pkcs11.GetSlotList(true)[0];

                // Open RW session
                using (Session session = slot.OpenSession(false))
                {
                    // Login as normal user with current PIN
                    session.Login(CKU.CKU_USER, "0000");

                    // Set the new pin for the logged in user
                    session.SetPin("0000", "1111");

                    session.Logout();
                }
            }
        }
    }
}

答案 1 :(得分:0)

使用针对C#发布的@jariq答案,我可以在PowerShell中使用以下内容来更改Admin PIN

  

注意:这是专门针对正在被IDPrime MD产品线取代的金雅拓IDPrime .NET卡。有关详细信息,请参阅本文末尾。

# www.pkcs11interop.net
Add-Type -Path "C:\Somepath\Pkcs11Interop.4.0.0\lib\net45\Pkcs11Interop.dll"

# Gemalto PKCS11 driver
# 1 = single threaded
$pkcs11 = New-Object Net.Pkcs11Interop.HighLevelAPI.Pkcs11("C:\somepath\gtop11dotnet64.dll",1)

# 0 = SlotsType.WithTokenPresent
$slots = $pkcs11.GetSlotList(0)

$slot = $slots[0] # often its the first

# create session
# 1 = SessionType.ReadWrite
$session = $slot.OpenSession(1)

[byte[]]$defaultPIN = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

# 000000000000000000000001
[byte[]]$newPIN = 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31

# 0 = Security Officer a.k.a. Admin
$session.Login(0, $defaultPIN)

$session.SetPin($defaultPIN, $newPIN)

$session.Dispose()
$slot.CloseAllSessions()
$pkcs11.Dispose()

我发现将每个PIN转换为字节数组最成功,可用于登录和更改PIN。要将48位管理员密码转换为24个字节,请创建以下功能。

Function Convert-AdminPinToByteArray([Validatepattern("^[0-9A-F]{48}$")][string]$AdminPIN)
{
    $ReturnByte = New-Object byte[] 24

    $n = 0

    for($i=0;$i -lt $ReturnByte.Length;$i++)
    {
        $ReturnByte[$i] = [byte]"0x$($AdminPIN.SubString($n,2))"
        $n = $n + 2
    }

    return $ReturnByte

} # End Function Convert-AdminPinToByteArray

金雅拓卡类型

以上示例基于金雅拓IDPrime .NET 卡,这些卡正在退役。 End of Sale (EOS) announcement is here

IDPrime .Net
IDPrime .Net Bio

Key Dates: 
Milestone                  Date
Last-Time-Buy (LTB)        September 29, 2017
End-of-Sale (EOS)          September 30, 2017
End-of-Life (EOL)          September 30, 2018

替换

Per the EOS announcement PDF

  

产品Gemalto的IDPrime .NET 510/511智能卡系列将被 IDPrime MD 83x IDPrime MD 84x 系列智能卡取代。

编程替换卡

我已经提供了有关区分卡类型的信息,因为我有一个Gemalto IDPrime MD 830用于测试,上述技术不起作用。实际上,使用上述技术,卡片甚至不会显示在阅读器中。