我需要將我們的IVR與ATM交換機集成。在這種情況下,IVR只需發送以ISO格式9594-1格式0形成的引腳塊(區域引腳鍵 - 引腳加密)。我們有清除組件 - 1,2, ZMK - 密鑰檢查值。我需要知道使用ZPK加密生成PIN塊格式0的步驟。另外,因爲我是初學者,所以需要了解清晰組件& ZMK所扮演的角色。ZPK加密ISO格式9594-1格式0
-1
A
回答
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 []轉換爲十六進制字符串以進行診斷的實用程序。
相關問題
- 1. extjs datefield iso格式?
- 2. C#加密格式
- 3. 正確的ISO 8601格式
- 4. 可以在javascript ISO格式
- 5. Angular 2 iso日期格式
- 6. iso 19794-2指紋格式
- 7. Swift NSDate iso 8601格式
- 8. VB.net ISO日期格式
- 9. PHP - 日期格式ISO 8601
- 10. 使用ISO格式日期
- 11. 「%s」%格式與「{0}」。format()vs「?」格式
- 12. Flex Spark CurrencyFormatter格式'0'格式錯誤
- 13. Python日期格式(0/0/0000樣式)
- 14. 格式ISO 8601日期字符串在上午0:00用JavaScript
- 15. 瞬間JS日期格式從ISO格式刪除減號
- 16. 將ISO日期格式轉換爲XSLT中的RFC 2822格式
- 17. Java,將ISO日期格式更改爲所需格式
- 18. NodeTime中ISO-8601格式值的偏移格式來自哪裏?
- 19. 格式化JSON日期添加0
- 20. UTC/ISO 8601格式的日期轉換
- 21. ISO日期格式錯誤的日子
- 22. 在ISO當前時間8601格式
- 23. 如何獲得iso代碼格式GeoLite2?
- 24. 格式化iso-8601日期字符串
- 25. 「date -d」不接受ISO 8601格式
- 26. Moment.js不支持Microsoft/ISO格式?
- 27. 將SQL日期更新爲ISO格式
- 28. Oracle到Hibernate到ISO 8601日期格式
- 29. 以ISO-19115格式發佈CKAN數據
- 30. PHP解析日期ISO格式
我公佈的解決方案是否幫助您?如果是這樣,你能否將答案標記爲已接受。 – andyvan