2017-08-01 29 views
-1

我需要將我們的IVR與ATM交換機集成。在這種情況下,IVR只需發送以ISO格式9594-1格式0形成的引腳塊(區域引腳鍵 - 引腳加密)。我們有清除組件 - 1,2, ZMK - 密鑰檢查值。我需要知道使用ZPK加密生成PIN塊格式0的步驟。另外,因爲我是初學者,所以需要了解清晰組件& ZMK所扮演的角色。ZPK加密ISO格式9594-1格式0

+0

我公佈的解決方案是否幫助您?如果是這樣,你能否將答案標記爲已接受。 – andyvan

回答

0

這裏有一些javascript會將一個pin加密成一個Format-0(PAN-free)pinblock。在這個例子中,它創建了一個隨機DES ZPK(區域PIN鍵),但是如果您願意,您可以使用固定區域PIN鍵。它也使用CryptoJS。

(我有在C#中的例子,如果你需要它)

_createPinblockFromPin: function(pin) { 

    var pinBlockString = "1" + pin.length.toString() + pin; 
    while (pinBlockString.length < 16) { 

     var r = encoding.b2h((Math.random() * 0x100) & 255); 
     pinBlockString += r.toString(8).toUpperCase(); 
    } 
    return pinBlockString; 
} 

_createZpk: function() { 

    var key = CryptoJS.enc.Hex.stringify(CryptoJS.lib.WordArray.random(16)); 
    return key.toUpperCase(); 
} 

_encryptPinBlock: function(clearPinBlockHex, zpkHex) { 

    var clearPinBlock = CryptoJS.enc.Hex.parse(clearPinBlockHex); 
    var key = CryptoJS.enc.Hex.parse(zpkHex); 

    key.words[4] = key.words[0]; 
    key.words[5] = key.words[1]; 

    var iv = CryptoJS.lib.WordArray.create(64/8); 
    var options = { iv: iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }; 
    var encrypted = CryptoJS.TripleDES.encrypt(clearPinBlock, key, options); 
    var encryptedHex = encrypted.toString().toUpperCase(); 

    return encryptedHex; 
} 

用法爲:

var clearPinBlock = this._createPinblockFromPin(pin); 
var clearZpk = this._createZpk(); 
var ePinBlock = this._encryptPinBlock(clearPinBlock, clearZpk); 

下面是使用BouncyCastle.net

// create zpk 
var keyGenParams = new KeyGenerationParameters(new SecureRandom(), 128); 
var keyGen = new DesEdeKeyGenerator(); 
keyGen.Init(keyGenParams); 
var zpk = keyGen.GenerateKey(); 
System.Diagnostics.Debug.WriteLine($"zpk->{DataFormatter.ToHexString(zpk)}"); 

// create pinblock 
var random = new Random(); 
var pinString = $"1{pin.Length}{pin}"; 
while (pinString.Length < 16) pinString += random.Next(0, 9).ToString(); 
var pinBlock = DataFormatter.HexStringToByteArray(pinString); 

System.Diagnostics.Debug.WriteLine($"clearPinBlock->{DataFormatter.ToHexString(pinBlock)}"); 

// encrypt pinblock 
var pinBlockZpk = new byte[8]; 
var keyParam = new DesEdeParameters(zpk); 
var desEngine1 = new DesEdeEngine(); 
desEngine1.Init(true, keyParam); 
desEngine1.ProcessBlock(pinBlock, 0, pinBlockZpk, 0); 
System.Diagnostics.Debug.WriteLine($"pinBlockZpk-> {DataFormatter.ToHexString(pinBlockZpk)}"); 

C#示例請注意,DataFormatter.ToHexString()只是一個將byte []轉換爲十六進制字符串以進行診斷的實用程序。

+0

嗨,非常感謝。你能否提供C#示例。 – Dnyati

+0

在原始答案中添加了一個C#示例。它也使用一個隨機區域針鍵,但您可以使用現有的或交換。 – andyvan