evgeniyvb / dukpt-php
PHP中的DUKPT实现
dev-master
2023-01-20 14:55 UTC
Requires
- php: >=5.3.0
- phpseclib/phpseclib: *
This package is not auto-updated.
Last update: 2024-09-27 22:41:48 UTC
README
一个用于处理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等)。如果不起作用,请尝试另一种模式...