evgeniyvb/dukpt-php

PHP中的DUKPT实现

dev-master 2023-01-20 14:55 UTC

This package is not auto-updated.

Last update: 2024-09-27 22:41:48 UTC


README

Scrutinizer Continuous Inspections Scrutinizer Quality Score Code Coverage

一个用于处理DUKPT解密的库。

DUKPT参考

DUKPT定义在ANSI X9.24-1:2009标准中。

术语表

  • 3DES - 三重DES (见DES);
  • AES - 高级加密标准;
  • BDK - 基础派生密钥;
  • DES - 数据加密标准;
  • DUKPT - 每笔交易派生唯一密钥;
  • KSN - 密钥序列号;
  • IPEK - 初始PIN加密密钥;
  • MAC - 消息认证码

简要说明

DUKPT是一种处理信用卡读卡器加密密钥管理的标准。它由Visa在80年代发明。

使用DUKPT,读卡器使用一个唯一的密钥加密每一笔交易。这个密钥是通过该库中实现的复杂算法从基础派生密钥(BDK)派生出来的。

派生密钥是从BDK和KSN计算出来的,KSN是由设备标识符(唯一的)和一个从1开始的序列号组成的序列号。这个序列计数器有21位。这将允许超过200万次的使用,但标准指出,只能使用小于或等于10个“1”位的二进制数,因为算法非常占用CPU资源,每个“1”位都需要额外的计算。

基于BDK和KSN,算法计算IPEK,它是计算未来密钥的基础。

注意,对于每个BDK/KSN对,不同的密钥用于不同的用途

  • PIN加密密钥
  • MAC请求密钥
  • MAC响应密钥
  • 数据请求密钥
  • 数据响应密钥

我使用的设备使用了Data Request Key来加密信用卡数据。

安装

  • 在您的composer.json中包含库;
"require": {
...
"camcima/dukpt-php": "dev-master"
}
  • 运行composer update

使用

要计算解密密钥,您必须拥有KSN和BDK。

<?php

use DUKPT\DerivedKey;
use DUKPT\KeySerialNumber;
use DUKPT\Utility;

$ksnObj = new KeySerialNumber($ksn);
$decryptionKey = DerivedKey::calculateDataEncryptionRequestKey($ksnObj, $bdk);

并且要使用3DES解密

<?php

use DUKPT\DerivedKey;
use DUKPT\KeySerialNumber;
use DUKPT\Utility;

$decryptedData = Utility::hex2bin(
                    Utility::removePadding(
                        Utility::tripleDesDecrypt($encryptedHexData, $decryptionKey, true)
                    )
                  );

tripleDesDecrypt方法的最后一个参数将加密模式更改为CBC3(true),而正常模式是ECB。我这样做是因为我们测试了一个中国设备,该设备使用了这种DES模式。

如果您想查看示例,请查看测试

注意

请注意,不同设备之间存在一些DES/3DES/AES实现差异,因为DES有许多模式(ECB、CBC、CFB、OFB等)。如果不起作用,请尝试另一种模式...