預約系統 IOS / Android Windows

teacrypt.js 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. function teaEncrypt(plaintext, password) {
  2. var v = new Array(2), k = new Array(4), s = "", i;
  3. var len;
  4. for (var i=0; i<4; i++) k[i] = Str4ToLong(password.slice(i*4,(i+1)*4));
  5. var btxt = new TextEncoder().encode(plaintext);
  6. if ((btxt.byteLength+1)&0x7) len = (((btxt.byteLength+1)>>>3)+1)*8
  7. else len = (btxt.byteLength+1)
  8. var teadata = new ArrayBuffer(len);
  9. for (i=0; i<len; i+=8) { // encode plaintext into s in 64-bit (8 char) blocks
  10. v[0] = byteArryToLong(btxt, i)
  11. v[1] = byteArryToLong(btxt, i+4)
  12. code(v, k);
  13. LongToBuffer(i, v, teadata);
  14. }
  15. return arrayBufferToBase64(teadata);
  16. }
  17. function teaDecrypt(ciphertext, password) {
  18. var v = new Array(2), k = new Array(4), s = "", i;
  19. for (var i=0; i<4; i++) k[i] = Str4ToLong(password.slice(i*4,(i+1)*4));
  20. var teadata = base64ToarrayBuffer(ciphertext);
  21. var stxt = new Uint8Array(teadata.byteLength);
  22. for (i=0; i<teadata.length; i+=8) {
  23. BufferToLong(i,v,teadata)
  24. decodevvv(v, k);
  25. LongToBuffer(i, v, stxt);
  26. }
  27. for (i=0; i<stxt.byteLength; i++) {
  28. if (stxt[i]==0) {
  29. break;
  30. }
  31. }
  32. const decoder = new TextDecoder("utf-8");
  33. return decoder.decode(stxt.slice(0, i));
  34. }
  35. function code(v, k) {
  36. var v0 = v[0], v1 = v[1];
  37. var delta = 0x479E3919, i, sum = 0;
  38. for (i=0; i<32; i++) {
  39. sum += delta;
  40. v0 += ((v1<<4) + k[0]) ^ (v1 + sum) ^ ((v1>>>5) + k[1]);
  41. v0 &= 0xffffffff
  42. v1 += ((v0<<4) + k[2]) ^ (v0 + sum) ^ ((v0>>>5) + k[3]);
  43. v1 &= 0xffffffff
  44. }
  45. v[0] = v0; v[1] = v1;
  46. }
  47. function decodevvv(v, k) {
  48. var v0 = v[0], v1 = v[1];
  49. var delta = 0x479E3919, sum = delta*32, i;
  50. for (i=0; i<32; i++) {
  51. v1 -= ((v0<<4) + k[2]) ^ (v0 + sum) ^ ((v0>>>5) + k[3]);
  52. v1 &= 0xffffffff
  53. v0 -= ((v1<<4) + k[0]) ^ (v1 + sum) ^ ((v1>>>5) + k[1]);
  54. v0 &= 0xffffffff
  55. sum -= delta;
  56. }
  57. v[0]=v0; v[1]=v1;
  58. }
  59. // supporting functions
  60. function Str4ToLong(s) { // convert 4 chars of s to a numeric long
  61. var v = 0;
  62. for (var i=0; i<4; i++) v |= s.charCodeAt(i) << i*8;
  63. return isNaN(v) ? 0 : v;
  64. }
  65. function LongToStr4(v) { // convert a numeric long to 4 char string
  66. var s = String.fromCharCode(v & 0xFF, v>>8 & 0xFF, v>>16 & 0xFF, v>>24 & 0xFF);
  67. return s;
  68. }
  69. function LongLognToStr8(v0, v1) {
  70. var s = '';
  71. var n = v0;
  72. for (var i=0; i<4; i++) {
  73. if ((n&0xFF)==0) {
  74. return s;
  75. }
  76. else {
  77. s += String.fromCharCode(n & 0xFF)
  78. n >>= 8
  79. }
  80. }
  81. n = v1
  82. for (var i=0; i<4; i++) {
  83. if ((n&0xFF)==0) {
  84. return s;
  85. }
  86. else {
  87. s += String.fromCharCode(n & 0xFF)
  88. n >>= 8
  89. }
  90. }
  91. return s
  92. }
  93. function LongToHex4(v) { // convert a numeric long to 4 char hex
  94. var s = (v & 0xFF).toString(16);
  95. s += (v>>8 & 0xFF).toString(16);
  96. s += (v>>16 & 0xFF).toString(16);
  97. s += (v>>24 & 0xFF).toString(16);
  98. return s;
  99. }
  100. function byteArryToLong(txt, i) {
  101. var v = 0;
  102. if (i<txt.byteLength) {
  103. v = txt[i];
  104. if ((i+1)<txt.byteLength) v |= (txt[i+1] << 8);
  105. if ((i+2)<txt.byteLength) v |= (txt[i+2] << 16);
  106. if ((i+3)<txt.byteLength) v |= (txt[i+3] << 24);
  107. }
  108. return v;
  109. }
  110. function LongToBuffer(n, v, teadata) {
  111. teadata[n] = v[0] & 0xFF;
  112. teadata[n+1] = v[0]>>8 & 0xFF;
  113. teadata[n+2] = v[0]>>16 & 0xFF;
  114. teadata[n+3] = v[0]>>24 & 0xFF;
  115. teadata[n+4] = v[1] & 0xFF;
  116. teadata[n+5] = v[1]>>8 & 0xFF;
  117. teadata[n+6] = v[1]>>16 & 0xFF;
  118. teadata[n+7] = v[1]>>24 & 0xFF;
  119. }
  120. function BufferToLong(n, v, teadata) {
  121. v[0] = 0;
  122. for (var i=0; i<4; i++) {
  123. v[0] |= teadata[n+i] << i*8;
  124. }
  125. v[0] = isNaN(v[0]) ? 0 : v[0];
  126. v[1] = 0;
  127. for (var i=0; i<4; i++) {
  128. v[1] |= teadata[n+4+i] << i*8;
  129. }
  130. v[1] = isNaN(v[1]) ? 0 : v[1];
  131. }
  132. function arrayBufferToBase64(bytes) {
  133. const byteArray = new Uint8Array(bytes.byteLength);
  134. for(var i=0; i<byteArray.length; i++) {
  135. byteArray[i] = bytes[i]
  136. }
  137. const binString = String.fromCodePoint(...byteArray);
  138. return btoa(binString);
  139. }
  140. function base64ToarrayBuffer(base64) {
  141. var binaryString = atob(base64);
  142. var bytes = new Uint8Array(binaryString.length);
  143. for (var i = 0; i < binaryString.length; i++) {
  144. bytes[i] = binaryString.charCodeAt(i);
  145. }
  146. return bytes;
  147. }
  148. function escCtrlCh(str) { // escape control chars which might cause problems with encrypted texts
  149. return str.replace(/[\0\t\n\v\f\r\xa0'"!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
  150. }
  151. function unescCtrlCh(str) { // unescape potentially problematic nulls and control characters
  152. return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
  153. }