nfcTool.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. const CryptoJS1 = require("./aes.js");
  2. //3DES hex 16进制字符串加密
  3. // const encodeHexString = (data, key) => {
  4. // let keyHex = CryptoJS.enc.Hex.parse(key);
  5. // let dataHex = CryptoJS.enc.Hex.parse(data);
  6. // let encrypted = CryptoJS.TripleDES.encrypt(dataHex, keyHex, {
  7. // mode: CryptoJS_mode_ECB,
  8. // padding: CryptoJS.pad.Pkcs7 //java 和 android pkcs5填充,js对应pkcs7
  9. // });
  10. // return encrypted.toString().toUpperCase();
  11. // // return encrypted.ciphertext.toString();
  12. // };
  13. const encodeHexString = (data, key) => {
  14.   var byteKey =CryptoJS1.enc.Hex.parse(key);
  15.   var byteData =CryptoJS1.enc.Hex.parse(data);
  16.   var encrypt =CryptoJS1.TripleDES.encrypt(byteData, byteKey, { mode:CryptoJS1.mode.ECB, padding:CryptoJS1.pad.NoPadding });
  17.   var encryptedStr = encrypt.ciphertext.toString();
  18.   return encryptedStr;
  19.    // return encrypted.ciphertext.toString();
  20.  };
  21. //3DES hex 16进制字符串解密
  22. const decodeHexString = (data, key) => {
  23. let keyHex = CryptoJS1.enc.Hex.parse(key);
  24. let dataHex = CryptoJS1.enc.Hex.parse(data);
  25. dataHex = CryptoJS1.enc.Base64.stringify(dataHex)
  26. let decrypted = CryptoJS1.TripleDES.decrypt(dataHex, keyHex, {
  27. mode: CryptoJS1.mode.ECB,
  28. padding: CryptoJS1.pad.NoPadding
  29. });
  30. return decrypted.toString(CryptoJS1.enc.Hex)//decrypted.toString();
  31. };
  32. const encodeHex = (data, key) =>
  33. {
  34. // key 不是16个字节,或者 24 字节返回空,
  35. if (key.length != 32 && key.length != 48)
  36. return null;
  37. if (key.length == 32) {
  38. //16字节密钥,则K1 = K3, 使用前8字节填充
  39. key = key + key.substr(0, 16);
  40. }
  41. let encData = encodeHexString(data, key);
  42. return encData//.substr(0, 16);
  43. };
  44. const decodeHex = (data, key) =>
  45. {
  46. // key 不是16个字节,或者 24 字节返回空,
  47. if (key.length != 32 && key.length != 48)
  48. return null;
  49. if (key.length == 32) {
  50. //16字节密钥,则K1 = K3, 使用前8字节填充
  51. key = key + key.substr(0, 16);
  52. }
  53. // //由于加密结果的后面8字节固定使用0808080808080808的密文 ,9F4AB5416A6D9DE5 填充,因此固定在需要解密的密文,后面增加9F4AB5416A6D9DE5
  54. // if (data.length == 32) {
  55. // data = data + "9F4AB5416A6D9DE5";
  56. // }
  57. return decodeHexString(data, key);
  58. };
  59. //buffer转16进制,解析nfc扫描结果的id
  60. function ab2hex(buffer) {
  61. var hexArr = Array.prototype.map.call(
  62. new Uint8Array(buffer),
  63. function (bit) {
  64. return ('00' + bit.toString(16)).slice(-2)
  65. }
  66. )
  67. return hexArr.join('').toUpperCase();
  68. }
  69. //buffer转num数组
  70. function ab2NumArr(buffer) {
  71. var numArr = Array.prototype.map.call(
  72. new Uint8Array(buffer),
  73. function (bit) {
  74. return bit
  75. }
  76. )
  77. return numArr
  78. }
  79. //num数组转字节字符串
  80. function numArrToBit(numArr){
  81. var bitArr = []
  82. for(var i in numArr){
  83. bitArr.push(String.fromCharCode(numArr[i]))
  84. }
  85. return bitArr.join('')
  86. }
  87. //num数组转16进制字符串
  88. function numArrToHex(numArr){
  89. var bitArr = []
  90. for(var i in numArr){
  91. var temp = numArr[i].toString(16).toUpperCase()
  92. if(temp.length == 1)temp = "0"+temp
  93. bitArr.push(temp)
  94. }
  95. return bitArr.join('')
  96. }
  97. function hex2int(hex) {
  98. var len = hex.length, a = new Array(len), code;
  99. for (var i = 0; i < len; i++) {
  100. code = hex.charCodeAt(i);
  101. if (48<=code && code < 58) {
  102. code -= 48;
  103. } else {
  104. code = (code & 0xdf) - 65 + 10;
  105. }
  106. a[i] = code;
  107. }
  108. return a.reduce(function(acc, c) {
  109. acc = 16 * acc + c;
  110. return acc;
  111. }, 0);
  112. }
  113. //16进制字符串转num数组
  114. function hexToNumArr(hex){
  115. var numArr = []
  116. for (var i = 0; i < hex.length;i = i + 2) {
  117. numArr.push(parseInt(hex.substr(i, 2), 16));
  118. }
  119. return numArr
  120. }
  121. function str2ab(str) {
  122. var buf = new ArrayBuffer(str.length*2); // 每个字符占用2个字节
  123. var bufView = new Uint16Array(buf);
  124. for (var i=0, strLen=str.length; i<strLen; i++) {
  125. bufView[i] = str.charCodeAt(i);
  126. }
  127. return buf;
  128. }
  129. function str2NumArr(str) {
  130. var len = str.length
  131. var arr = new Array(len);
  132. for (var i=0; i<len; i++) {
  133. arr[i] = str.charCodeAt(i);
  134. }
  135. return arr;
  136. }
  137. //
  138. function hexToStr(hex) {
  139. var trimedStr = hex.trim();
  140. var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
  141. var len = rawStr.length;
  142. var curCharCode;
  143. var resultStr = [];
  144. for (var i = 0; i < len; i = i + 2) {
  145. curCharCode = parseInt(rawStr.substr(i, 2), 16);
  146. resultStr.push(curCharCode);
  147. }
  148. var bytesView = new Uint8Array(resultStr);
  149. var str = String.fromCharCode(...bytesView);
  150. // str = unescape(str.replace(/\\u/g, '%u'))
  151. return str;
  152. }
  153. //hex转2进制
  154. function num2bin(num){
  155. return ("00000000" + (parseInt(num)).toString(2)).substr(-8);
  156. }
  157. let tools = {
  158. encode3des:encodeHex,
  159. decode3des:decodeHex,
  160. ab2hex,
  161. ab2NumArr,
  162. numArrToBit,
  163. numArrToHex,
  164. hexToNumArr,
  165. str2ab,
  166. hexToStr,
  167. num2bin,
  168. hex2int,
  169. str2NumArr,
  170. }
  171. module.exports = {
  172. tools
  173. }