camcima / dukpt-php
PHP中的DUKPT实现
1.0.0
2013-03-04 17:43 UTC
Requires
- php: >=5.3.0
- phpseclib/phpseclib: *
This package is auto-updated.
Last update: 2024-09-07 05:02:53 UTC
README
一个用于处理DUKPT解密的库。
DUKPT参考
DUKPT在ANSI X9.24-1:2009标准中定义。
术语表
- 3DES - 三重DES (参见DES);
- AES - 高级加密标准;
- BDK - 基础推导密钥;
- DES - 数据加密标准;
- DUKPT - 每笔交易导出唯一密钥;
- KSN - 密钥序列号;
- IPEK - 初始PIN加密密钥;
- MAC - 消息认证码
简要说明
DUKPT是一个关于信用卡读取器加密密钥管理的标准。它在20世纪80年代由Visa发明。
使用DUKPT,信用卡读取器使用一个唯一密钥加密每一笔交易。这个密钥是通过使用该库中实现的复杂算法从基础推导密钥(BDK)推导出来的。
从BDK和KSN计算出的导出密钥,KSN是由设备标识符(唯一的)和一个从1开始的序列号组成的序列号。这个序列计数器有21位。这将允许超过200万次使用,但标准规定只能使用小于或等于10个“1”位的二进制数,因为该算法非常占用CPU资源,每个“1”位都需要额外的计算。
基于BDK和KSN,算法计算出IPEK,这是计算未来密钥的基础。
请注意,对于每个BDK/KSN对,针对不同的用途会生成不同的密钥
- PIN加密密钥
- MAC请求密钥
- MAC响应密钥
- 数据请求密钥
- 数据响应密钥
我使用的设备使用了数据请求密钥
来加密信用卡数据。
安装
- 将库包含在您的
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有很多模式(ECB、CBC、CFB、OFB等),设备之间的DES/3DES/AES实现存在一些差异。如果不起作用,请尝试另一种模式...