算法暴露接口(xhs、dy、ks、wx、hnw)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
10 KiB

7 months ago
  1. import ctypes
  2. from functools import reduce
  3. from hashlib import md5
  4. """
  5. deskey的utf-8
  6. key还原标准des调用
  7. """
  8. def MD5(strs):
  9. m = md5()
  10. m.update(strs.encode("utf-8"))
  11. return m.hexdigest()
  12. def hex_2_str(v: int):
  13. v = v & 0xffffffff # 将结果转换为32位有符号整数
  14. tmp = str(hex(v))[2:]
  15. return "0" + tmp if len(tmp) % 2 > 0 else tmp
  16. def logical_left_shift(n, bits):
  17. """
  18. :param n:
  19. :param bits:
  20. :return:
  21. """
  22. return ctypes.c_int(n << bits).value
  23. def logical_right_shift(n, bits):
  24. """
  25. :param n:
  26. :param bits:
  27. :return:
  28. """
  29. return (n % 0x100000000) >> bits
  30. def get_s_box(i, j):
  31. """
  32. sbox
  33. :param i:
  34. :param j:
  35. :return:
  36. """
  37. s_box1 = [-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272,
  38. -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0,
  39. -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304,
  40. -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768,
  41. -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576,
  42. -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648,
  43. -2146435040, -2146402272, 1081344]
  44. s_box2 = [8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736,
  45. 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928,
  46. 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801,
  47. 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801,
  48. 128, 8388608, 8192, 8396928]
  49. s_box3 = [536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304,
  50. 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16,
  51. 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16,
  52. 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928,
  53. 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384,
  54. 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312]
  55. s_box4 = [268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760,
  56. 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664,
  57. 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096,
  58. 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616,
  59. 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160,
  60. 4160, 262208, 268435456, 268701696]
  61. s_box5 = [16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244,
  62. 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540,
  63. 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216,
  64. 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752,
  65. 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756]
  66. s_box6 = [520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072,
  67. 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592,
  68. 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520,
  69. 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808,
  70. 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520,
  71. 134348800, 131592, 8, 134348808, 131584]
  72. s_box7 = [256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688,
  73. 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080,
  74. 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256,
  75. 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688,
  76. 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256,
  77. 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112,
  78. 34078976, 1073742080]
  79. s_box8 = [2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2,
  80. 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154,
  81. 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914,
  82. 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064,
  83. 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866,
  84. 67110912, 2048, 2097154]
  85. s_box = [s_box1, s_box2, s_box3, s_box4, s_box5, s_box6, s_box7, s_box8]
  86. return s_box[i][j]
  87. def alg_main(key, _plaintext_left, _plaintext_right):
  88. """
  89. 3. +
  90. :param key:
  91. :param _plaintext_left:
  92. :param _plaintext_right:
  93. :return: 16
  94. """
  95. for i in range(0, len(key), 2):
  96. _key = key[i] # 轮密钥
  97. _key2 = key[i+1]
  98. tmp = _plaintext_right ^ _key
  99. tmp1 = (logical_right_shift(_plaintext_right, 4) | logical_left_shift(_plaintext_right, 28)) ^ _key2
  100. mid = get_s_box(0, logical_right_shift(tmp, 24) & 63) | get_s_box(1, logical_right_shift(tmp, 16) & 63) | \
  101. get_s_box(2, logical_right_shift(tmp, 8) & 63) | get_s_box(3, tmp & 63) | \
  102. get_s_box(4, logical_right_shift(tmp1, 24) & 63) | get_s_box(5, logical_right_shift(tmp1, 16) & 63) | \
  103. get_s_box(6, logical_right_shift(tmp1, 8) & 63) | get_s_box(7, tmp1 & 63)
  104. tmp2 = _plaintext_left ^ mid
  105. _plaintext_left = _plaintext_right # 左边继承右边
  106. _plaintext_right = tmp2
  107. # print(f"第{i}轮 ; ", _plaintext_left, _plaintext_right, mid, _key, _key2, tmp, tmp1)
  108. # break
  109. t1 = logical_right_shift(_plaintext_right, 1) | logical_left_shift(_plaintext_right, 31)
  110. t2 = logical_right_shift(_plaintext_left, 1) | logical_left_shift(_plaintext_left, 31)
  111. t3 = (logical_right_shift(t1, 1) ^ t2) & 1431655765
  112. t4 = t2 ^ t3
  113. t5 = t1 ^ logical_left_shift(t3, 1)
  114. t6 = (logical_right_shift(t4, 8) ^ t5) & 16711935
  115. t7 = t5 ^ t6
  116. t8 = t4 ^ logical_left_shift(t6, 8)
  117. t9 = (logical_right_shift(t8, 2) ^ t7) & 858993459
  118. t10 = t7 ^ t9
  119. t11 = logical_left_shift(t9, 2) ^ t8
  120. t12 = (logical_right_shift(t10, 16) ^ t11) & 65535
  121. t13 = t11 ^ t12
  122. t14 = t10 ^ logical_left_shift(t12, 16)
  123. t15 = (logical_right_shift(t14, 4) ^ t13) & 252645135
  124. t16 = t15 ^ t13
  125. t17 = t14 ^ logical_left_shift(t15, 4)
  126. b1 = logical_right_shift(t17, 24)
  127. b2 = logical_right_shift(t17, 16) & 255
  128. b3 = logical_right_shift(t17, 8) & 255
  129. b4 = t17 & 255
  130. b5 = logical_right_shift(t16, 24)
  131. b6 = logical_right_shift(t16, 16) & 255
  132. b7 = logical_right_shift(t16, 8) & 255
  133. b8 = t16 & 255
  134. segment_list = [b1, b2, b3, b4, b5, b6, b7, b8]
  135. segment = "".join([chr(s) for s in segment_list])
  136. segment_hex = "".join([hex_2_str(s) for s in segment_list])
  137. # print(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17)
  138. # print(segment)
  139. # print(segment_hex)
  140. return segment_hex, segment
  141. def deal_array2(array1_res, array2_res):
  142. """
  143. 2. alg_main中的后半部分是可逆的
  144. :param array1_res:
  145. :param array2_res:
  146. :return:
  147. """
  148. tmp = (logical_right_shift(array1_res, 4) ^ array2_res) & 252645135
  149. tmp1 = array2_res ^ tmp
  150. tmp1_ = array1_res ^ logical_left_shift(tmp, 4)
  151. tmp2 = (logical_right_shift(tmp1_, 16) ^ tmp1) & 65535
  152. tmp2_ = tmp1 ^ tmp2
  153. tmp3 = logical_right_shift(tmp2_, 2)
  154. tmp4 = tmp1_ ^ logical_left_shift(tmp2, 16)
  155. tmp5 = (tmp3 ^ tmp4) & 858993459
  156. tmp5_ = logical_left_shift(tmp5, 2)
  157. tmp6 = tmp5 ^ tmp4
  158. tmp7 = (logical_right_shift(tmp2_ ^ tmp5_, 8) ^ tmp6) & 16711935
  159. tmp7_ = tmp6 ^ tmp7
  160. tmp8 = logical_right_shift(tmp7_, 1)
  161. tmp9 = tmp2_ ^ tmp5_ ^ logical_left_shift(tmp7, 8)
  162. tmp10 = (tmp8 ^ tmp9) & 1431655765
  163. tmp10_ = tmp9 ^ tmp10
  164. tmp11 = tmp7_ ^ logical_left_shift(tmp10, 1)
  165. tmp12 = logical_left_shift(tmp11, 1) | logical_right_shift(tmp11, 31)
  166. tmp13 = logical_left_shift(tmp10_, 1) | logical_right_shift(tmp10_, 31)
  167. return tmp12, tmp13
  168. def deal_array(array):
  169. """
  170. 1.
  171. :param array:
  172. :return:
  173. """
  174. for i in range(len(array)):
  175. array[i] = array[i] << (24 - 8 * i)
  176. res = reduce(lambda x, y: x | y, array)
  177. return res
  178. def des_encrypt(key, plain_text):
  179. """
  180. des加密入口
  181. :param key: list
  182. :param plain_text: list
  183. :return:
  184. """
  185. array1_hex = []
  186. array1_string = []
  187. for m in range(0, len(plain_text), 8):
  188. left_list, right_list = plain_text[m:m + 4], plain_text[m + 4:m + 8]
  189. left, right = deal_array2(deal_array(left_list), deal_array(right_list))
  190. segment_hex, segment = alg_main(key, left, right)
  191. array1_hex.append(segment_hex)
  192. array1_string.append(segment)
  193. _hex = "".join(array1_hex)
  194. _string = "".join(array1_string)
  195. return _hex, _string