re-common 10.0.22__py3-none-any.whl → 10.0.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. re_common/baselibrary/__init__.py +4 -4
  2. re_common/baselibrary/baseabs/__init__.py +6 -6
  3. re_common/baselibrary/baseabs/baseabs.py +26 -26
  4. re_common/baselibrary/database/mbuilder.py +132 -132
  5. re_common/baselibrary/database/moudle.py +93 -93
  6. re_common/baselibrary/database/msqlite3.py +194 -194
  7. re_common/baselibrary/database/mysql.py +169 -169
  8. re_common/baselibrary/database/sql_factory.py +26 -26
  9. re_common/baselibrary/mthread/MThreadingRun.py +486 -486
  10. re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
  11. re_common/baselibrary/mthread/__init__.py +2 -2
  12. re_common/baselibrary/mthread/mythreading.py +695 -695
  13. re_common/baselibrary/pakge_other/socks.py +404 -404
  14. re_common/baselibrary/readconfig/config_factory.py +18 -18
  15. re_common/baselibrary/readconfig/ini_config.py +317 -317
  16. re_common/baselibrary/readconfig/toml_config.py +49 -49
  17. re_common/baselibrary/temporary/envdata.py +36 -36
  18. re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
  19. re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
  20. re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
  21. re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
  22. re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
  23. re_common/baselibrary/tools/contrast_db3.py +123 -123
  24. re_common/baselibrary/tools/copy_file.py +39 -39
  25. re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
  26. re_common/baselibrary/tools/foreachgz.py +39 -39
  27. re_common/baselibrary/tools/get_attr.py +10 -10
  28. re_common/baselibrary/tools/image_to_pdf.py +61 -61
  29. re_common/baselibrary/tools/java_code_deal.py +139 -139
  30. re_common/baselibrary/tools/javacode.py +79 -79
  31. re_common/baselibrary/tools/mdb_db3.py +48 -48
  32. re_common/baselibrary/tools/merge_file.py +171 -171
  33. re_common/baselibrary/tools/merge_gz_file.py +165 -165
  34. re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
  35. re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
  36. re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
  37. re_common/baselibrary/tools/mongo_tools.py +50 -50
  38. re_common/baselibrary/tools/move_file.py +170 -170
  39. re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
  40. re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
  41. re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
  42. re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
  43. re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
  44. re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
  45. re_common/baselibrary/tools/myparsel.py +104 -104
  46. re_common/baselibrary/tools/rename_dir_file.py +37 -37
  47. re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
  48. re_common/baselibrary/tools/split_line_to_many.py +25 -25
  49. re_common/baselibrary/tools/stringtodicts.py +33 -33
  50. re_common/baselibrary/tools/workwechant_bot.py +84 -84
  51. re_common/baselibrary/utils/baseaiohttp.py +296 -296
  52. re_common/baselibrary/utils/baseaiomysql.py +87 -87
  53. re_common/baselibrary/utils/baseallstep.py +191 -191
  54. re_common/baselibrary/utils/baseavro.py +19 -19
  55. re_common/baselibrary/utils/baseboto3.py +291 -291
  56. re_common/baselibrary/utils/basecsv.py +32 -32
  57. re_common/baselibrary/utils/basedict.py +133 -133
  58. re_common/baselibrary/utils/basedir.py +241 -241
  59. re_common/baselibrary/utils/baseencode.py +351 -351
  60. re_common/baselibrary/utils/baseencoding.py +28 -28
  61. re_common/baselibrary/utils/baseesdsl.py +86 -86
  62. re_common/baselibrary/utils/baseexcel.py +264 -264
  63. re_common/baselibrary/utils/baseexcept.py +109 -109
  64. re_common/baselibrary/utils/basefile.py +654 -654
  65. re_common/baselibrary/utils/baseftp.py +214 -214
  66. re_common/baselibrary/utils/basegzip.py +60 -60
  67. re_common/baselibrary/utils/basehdfs.py +135 -135
  68. re_common/baselibrary/utils/basehttpx.py +268 -268
  69. re_common/baselibrary/utils/baseip.py +87 -87
  70. re_common/baselibrary/utils/basejson.py +2 -2
  71. re_common/baselibrary/utils/baselist.py +32 -32
  72. re_common/baselibrary/utils/basemotor.py +190 -190
  73. re_common/baselibrary/utils/basemssql.py +98 -98
  74. re_common/baselibrary/utils/baseodbc.py +113 -113
  75. re_common/baselibrary/utils/basepandas.py +302 -302
  76. re_common/baselibrary/utils/basepeewee.py +11 -11
  77. re_common/baselibrary/utils/basepika.py +180 -180
  78. re_common/baselibrary/utils/basepydash.py +143 -143
  79. re_common/baselibrary/utils/basepymongo.py +230 -230
  80. re_common/baselibrary/utils/basequeue.py +22 -22
  81. re_common/baselibrary/utils/baserar.py +57 -57
  82. re_common/baselibrary/utils/baserequest.py +279 -279
  83. re_common/baselibrary/utils/baseset.py +8 -8
  84. re_common/baselibrary/utils/basesmb.py +403 -403
  85. re_common/baselibrary/utils/basestring.py +382 -382
  86. re_common/baselibrary/utils/basetime.py +320 -320
  87. re_common/baselibrary/utils/baseurl.py +121 -121
  88. re_common/baselibrary/utils/basezip.py +57 -57
  89. re_common/baselibrary/utils/core/__init__.py +7 -7
  90. re_common/baselibrary/utils/core/bottomutils.py +18 -18
  91. re_common/baselibrary/utils/core/mdeprecated.py +327 -327
  92. re_common/baselibrary/utils/core/mlamada.py +16 -16
  93. re_common/baselibrary/utils/core/msginfo.py +25 -25
  94. re_common/baselibrary/utils/core/requests_core.py +103 -103
  95. re_common/baselibrary/utils/fateadm.py +429 -429
  96. re_common/baselibrary/utils/importfun.py +123 -123
  97. re_common/baselibrary/utils/mfaker.py +57 -57
  98. re_common/baselibrary/utils/my_abc/__init__.py +3 -3
  99. re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
  100. re_common/baselibrary/utils/mylogger.py +414 -414
  101. re_common/baselibrary/utils/myredisclient.py +861 -861
  102. re_common/baselibrary/utils/pipupgrade.py +21 -21
  103. re_common/baselibrary/utils/ringlist.py +85 -85
  104. re_common/baselibrary/utils/version_compare.py +36 -36
  105. re_common/baselibrary/utils/ydmhttp.py +126 -126
  106. re_common/facade/lazy_import.py +11 -11
  107. re_common/facade/loggerfacade.py +25 -25
  108. re_common/facade/mysqlfacade.py +467 -467
  109. re_common/facade/now.py +31 -31
  110. re_common/facade/sqlite3facade.py +257 -257
  111. re_common/facade/use/mq_use_facade.py +83 -83
  112. re_common/facade/use/proxy_use_facade.py +19 -19
  113. re_common/libtest/base_dict_test.py +19 -19
  114. re_common/libtest/baseavro_test.py +13 -13
  115. re_common/libtest/basefile_test.py +14 -14
  116. re_common/libtest/basemssql_test.py +77 -77
  117. re_common/libtest/baseodbc_test.py +7 -7
  118. re_common/libtest/basepandas_test.py +38 -38
  119. re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
  120. re_common/libtest/get_attr_test/settings.py +54 -54
  121. re_common/libtest/idencode_test.py +53 -53
  122. re_common/libtest/iniconfig_test.py +35 -35
  123. re_common/libtest/ip_test.py +34 -34
  124. re_common/libtest/merge_file_test.py +20 -20
  125. re_common/libtest/mfaker_test.py +8 -8
  126. re_common/libtest/mm3_test.py +31 -31
  127. re_common/libtest/mylogger_test.py +88 -88
  128. re_common/libtest/myparsel_test.py +27 -27
  129. re_common/libtest/mysql_test.py +151 -151
  130. re_common/libtest/pymongo_test.py +21 -21
  131. re_common/libtest/split_test.py +11 -11
  132. re_common/libtest/sqlite3_merge_test.py +5 -5
  133. re_common/libtest/sqlite3_test.py +34 -34
  134. re_common/libtest/tomlconfig_test.py +30 -30
  135. re_common/libtest/use_tools_test/__init__.py +2 -2
  136. re_common/libtest/user/__init__.py +4 -4
  137. re_common/studio/__init__.py +4 -4
  138. re_common/studio/assignment_expressions.py +36 -36
  139. re_common/studio/mydash/test1.py +18 -18
  140. re_common/studio/pydashstudio/first.py +9 -9
  141. re_common/studio/streamlitstudio/first_app.py +65 -65
  142. re_common/studio/streamlitstudio/uber_pickups.py +23 -23
  143. re_common/studio/test.py +18 -18
  144. re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +195 -0
  145. re_common/v2/baselibrary/business_utils/__init__.py +0 -0
  146. re_common/v2/baselibrary/business_utils/rel_tools.py +6 -0
  147. re_common/v2/baselibrary/decorators/utils.py +59 -59
  148. re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
  149. re_common/v2/baselibrary/tools/WeChatRobot.py +95 -79
  150. re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
  151. re_common/v2/baselibrary/tools/dict_tools.py +37 -37
  152. re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
  153. re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
  154. re_common/v2/baselibrary/tools/list_tools.py +65 -65
  155. re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
  156. re_common/v2/baselibrary/tools/text_matcher.py +326 -326
  157. re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
  158. re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
  159. re_common/v2/baselibrary/utils/author_smi.py +360 -360
  160. re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
  161. re_common/v2/baselibrary/utils/basedict.py +37 -37
  162. re_common/v2/baselibrary/utils/basehdfs.py +161 -161
  163. re_common/v2/baselibrary/utils/basepika.py +180 -180
  164. re_common/v2/baselibrary/utils/basetime.py +77 -77
  165. re_common/v2/baselibrary/utils/db.py +38 -38
  166. re_common/v2/baselibrary/utils/json_cls.py +16 -16
  167. re_common/v2/baselibrary/utils/mq.py +83 -83
  168. re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
  169. re_common/v2/baselibrary/utils/string_bool.py +186 -149
  170. re_common/v2/baselibrary/utils/string_clear.py +227 -204
  171. re_common/v2/baselibrary/utils/string_smi.py +18 -18
  172. re_common/v2/baselibrary/utils/stringutils.py +213 -213
  173. re_common/vip/base_step_process.py +11 -11
  174. re_common/vip/baseencodeid.py +90 -90
  175. re_common/vip/changetaskname.py +28 -28
  176. re_common/vip/core_var.py +24 -24
  177. re_common/vip/mmh3Hash.py +89 -89
  178. re_common/vip/proxy/allproxys.py +127 -127
  179. re_common/vip/proxy/allproxys_thread.py +159 -159
  180. re_common/vip/proxy/cnki_proxy.py +153 -153
  181. re_common/vip/proxy/kuaidaili.py +87 -87
  182. re_common/vip/proxy/proxy_all.py +113 -113
  183. re_common/vip/proxy/update_kuaidaili_0.py +42 -42
  184. re_common/vip/proxy/wanfang_proxy.py +152 -152
  185. re_common/vip/proxy/wp_proxy_all.py +181 -181
  186. re_common/vip/read_rawid_to_txt.py +91 -91
  187. re_common/vip/title/__init__.py +5 -5
  188. re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
  189. re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
  190. re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
  191. re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
  192. re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
  193. re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
  194. re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
  195. re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
  196. re_common/vip/title/transform/__init__.py +10 -10
  197. {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/LICENSE +201 -201
  198. {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/METADATA +16 -16
  199. re_common-10.0.24.dist-info/RECORD +230 -0
  200. {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/WHEEL +1 -1
  201. re_common-10.0.22.dist-info/RECORD +0 -227
  202. {re_common-10.0.22.dist-info → re_common-10.0.24.dist-info}/top_level.txt +0 -0
@@ -1,351 +1,351 @@
1
- import base64
2
- import binascii
3
-
4
- from Crypto.Util.Padding import pad
5
- from Crypto.Cipher import AES
6
-
7
-
8
- class BaseEncode(object):
9
-
10
- def __init__(self):
11
- pass
12
-
13
- @classmethod
14
- def get_byte_md5_value(cls, bytes):
15
- """
16
- 获得byte md5值
17
- :param bytes:需要操作的二进制
18
- :return:
19
- """
20
- import hashlib
21
- myMd5 = hashlib.md5(bytes)
22
- myMd5_Digest = myMd5.hexdigest()
23
- return myMd5_Digest
24
-
25
- @classmethod
26
- def get_md5_value(cls, src):
27
- """
28
- 获得字符串md5值
29
- :param src:需要操作的字符串
30
- :return:
31
- """
32
- import hashlib
33
- myMd5 = hashlib.md5()
34
- myMd5.update(src.encode("utf8"))
35
- myMd5_Digest = myMd5.hexdigest()
36
- return myMd5_Digest
37
-
38
- @classmethod
39
- def get_md5_value_16bit(cls, src):
40
- """
41
- 获取16位md5
42
- :param src:
43
- :return:
44
- """
45
- return cls.get_md5_value(src)[8:-8]
46
-
47
- @classmethod
48
- def get_byte_md5_value_16bit(cls, bytes):
49
- """
50
- 获取16位md5
51
- :param bytes:
52
- :return:
53
- """
54
- return cls.get_byte_md5_value(bytes)[8:-8]
55
-
56
- @classmethod
57
- def get_sha1_value(cls, src):
58
- """
59
- 获得字符串sha1值
60
- :param src:
61
- :return:
62
- """
63
- import hashlib
64
- mySha1 = hashlib.sha1()
65
- mySha1.update(src)
66
- mySha1_Digest = mySha1.hexdigest()
67
- return mySha1_Digest
68
-
69
- @classmethod
70
- def get_base64(cls, src):
71
- """
72
- 输入字符串,编码成base64
73
- :param src:
74
- :return:
75
- """
76
- strEncode = base64.b64encode(src.encode('utf8')).decode('utf8')
77
- return strEncode
78
-
79
- @classmethod
80
- def base64_get_str(cls, base64_str):
81
- """
82
- 输入base64字符串,输出原始字符串
83
- :param base64_str:
84
- :return:
85
- """
86
- src = base64.b64decode(base64_str.encode('utf8')).decode('utf8')
87
- return src
88
-
89
- @classmethod
90
- def aes_encode(cls, password, text, mode, iv=None):
91
- """
92
- https://blog.csdn.net/qq_42334096/article/details/122847876
93
- 在AES标准规范中,分组长度只能是128位 每个分组为16个字节(每个字节8位)。
94
- 密钥长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。
95
- AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
96
- AES-128 4 4 10
97
- AES-192 6 4 11
98
- AES-256 8 4 14
99
- 填充模式:这是因为如果明文不是128位(16字节)的则需要进行填充,需要将明文补充到16个字节整数倍的长度。在我们进行加解密时需要采用同样的填充方式,
100
- 否则无法解密成功。填充模式有:No Padding、PKCS5 Padding、PKCS7 Padding、ISO10126 Padding、Ansix923 Padding、Zero Padding等等。
101
- pip install pycryptodome
102
- (亲测,目前不用改文件夹名字了) 但是,在使用的时候导包是有问题的,这个时候只要修改一个文件夹的名称就可以完美解决这个问题
103
- C:\用户\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages
104
-
105
- 找到这个路径,下面有一个文件夹叫做crypto,将c改成C,对就是改成大写就ok了!
106
- liunx: pip install pycrypto
107
- :param password:
108
- :param text:
109
- :param mode:
110
- :return:
111
- """
112
- if mode == AES.MODE_ECB:
113
- assert len(password) % 16 == 0, Exception("密匙 位数应该为16的倍数")
114
- assert len(text) % 16 == 0, Exception("加密文本 位数应该为16的倍数")
115
- # MODE_ECB 秘钥必须为16字节或者16字节的倍数的字节型数据。
116
- # MODE_ECB 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
117
- aes = AES.new(password, AES.MODE_ECB) # 创建一个aes对象
118
- # AES.MODE_ECB 表示模式是ECB模式
119
- en_text = aes.encrypt(text) # 加密明文
120
- return en_text
121
- if mode == AES.MODE_CBC:
122
- # 1. 在Python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量、都需要是bytes(字节型)数据。python 在构建aes对象时也只能接受bytes类型数据。
123
- # 2.当秘钥,iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。
124
- # 3. CBC模式需要重新生成AES对象,为了防止这类错误,我写代码无论是什么模式都重新生成AES对象。
125
- assert iv is not None
126
- aes = AES.new(password, AES.MODE_CBC, iv) # 创建一个aes对象
127
- # AES.MODE_CBC 表示模式是CBC模式
128
- en_text = aes.encrypt(text)
129
- return en_text
130
-
131
- @classmethod
132
- def aes_decode(cls, password, en_text, mode, iv=None):
133
- """
134
- :return:
135
- """
136
- if mode == AES.MODE_ECB:
137
- assert len(password) % 16 == 0, Exception("密匙 位数应该为16的倍数")
138
- assert len(en_text) % 16 == 0, Exception("密文 位数应该为16的倍数")
139
- aes = AES.new(password, AES.MODE_ECB) # 创建一个aes对象
140
- # AES.MODE_ECB 表示模式是ECB模式
141
- text = aes.decrypt(en_text) # 加密明文
142
- return text
143
- if mode == AES.MODE_CBC:
144
- assert iv is not None
145
- aes = AES.new(password, AES.MODE_CBC, iv) # 创建一个aes对象
146
- # AES.MODE_CBC 表示模式是CBC模式
147
- text = aes.decrypt(en_text)
148
- return text
149
-
150
-
151
- # 数据类
152
- class MData():
153
- def __init__(self, data=b"", characterSet='utf-8'):
154
- # data肯定为bytes
155
- self.data = data
156
- self.characterSet = characterSet
157
-
158
- def saveData(self, FileName):
159
- with open(FileName, 'wb') as f:
160
- f.write(self.data)
161
-
162
- def fromString(self, data):
163
- self.data = data.encode(self.characterSet)
164
- return self.data
165
-
166
- def fromBase64(self, data):
167
- self.data = base64.b64decode(data.encode(self.characterSet))
168
- return self.data
169
-
170
- def fromHexStr(self, data):
171
- self.data = binascii.a2b_hex(data)
172
- return self.data
173
-
174
- def toString(self):
175
- return self.data.decode(self.characterSet)
176
-
177
- def toBase64(self):
178
- return base64.b64encode(self.data).decode()
179
-
180
- def toHexStr(self):
181
- return binascii.b2a_hex(self.data).decode()
182
-
183
- def toBytes(self):
184
- return self.data
185
-
186
- def __str__(self):
187
- try:
188
- return self.toString()
189
- except Exception:
190
- return self.toBase64()
191
-
192
-
193
- ### 封装类
194
- class AEScryptor():
195
- def __init__(self, key, mode, iv='', paddingMode="NoPadding", characterSet="utf-8"):
196
- '''
197
- 构建一个AES对象
198
- key: 秘钥,字节型数据
199
- mode: 使用模式,只提供两种,AES.MODE_CBC, AES.MODE_ECB
200
- iv: iv偏移量,字节型数据
201
- paddingMode: 填充模式,默认为NoPadding, 可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding
202
- characterSet: 字符集编码
203
- '''
204
- self.key = key
205
- self.mode = mode
206
- self.iv = iv
207
- self.characterSet = characterSet
208
- self.paddingMode = paddingMode
209
- self.data = ""
210
-
211
- def __ZeroPadding(self, data):
212
- data += b'\x00'
213
- while len(data) % 16 != 0:
214
- data += b'\x00'
215
- return data
216
-
217
- def __StripZeroPadding(self, data):
218
- data = data[:-1]
219
- while len(data) % 16 != 0:
220
- data = data.rstrip(b'\x00')
221
- if data[-1] != b"\x00":
222
- break
223
- return data
224
-
225
- def __PKCS5_7Padding(self, data):
226
- needSize = 16 - len(data) % 16
227
- if needSize == 0:
228
- needSize = 16
229
- return data + needSize.to_bytes(1, 'little') * needSize
230
-
231
- def __StripPKCS5_7Padding(self, data):
232
- paddingSize = data[-1]
233
- return data.rstrip(paddingSize.to_bytes(1, 'little'))
234
-
235
- def __paddingData(self, data):
236
- if self.paddingMode == "NoPadding":
237
- if len(data) % 16 == 0:
238
- return data
239
- else:
240
- return self.__ZeroPadding(data)
241
- elif self.paddingMode == "ZeroPadding":
242
- return self.__ZeroPadding(data)
243
- elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":
244
- return self.__PKCS5_7Padding(data)
245
- else:
246
- print("不支持Padding")
247
-
248
- def __stripPaddingData(self, data):
249
- if self.paddingMode == "NoPadding":
250
- return self.__StripZeroPadding(data)
251
- elif self.paddingMode == "ZeroPadding":
252
- return self.__StripZeroPadding(data)
253
-
254
- elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":
255
- return self.__StripPKCS5_7Padding(data)
256
- else:
257
- print("不支持Padding")
258
-
259
- def setCharacterSet(self, characterSet):
260
- '''
261
- 设置字符集编码
262
- characterSet: 字符集编码
263
- '''
264
- self.characterSet = characterSet
265
-
266
- def setPaddingMode(self, mode):
267
- '''
268
- 设置填充模式
269
- mode: 可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding
270
- '''
271
- self.paddingMode = mode
272
-
273
- def decryptFromBase64(self, entext):
274
- '''
275
- 从base64编码字符串编码进行AES解密
276
- entext: 数据类型str
277
- '''
278
- mData = MData(characterSet=self.characterSet)
279
- self.data = mData.fromBase64(entext)
280
- return self.__decrypt()
281
-
282
- def decryptFromHexStr(self, entext):
283
- '''
284
- 从hexstr编码字符串编码进行AES解密
285
- entext: 数据类型str
286
- '''
287
- mData = MData(characterSet=self.characterSet)
288
- self.data = mData.fromHexStr(entext)
289
- return self.__decrypt()
290
-
291
- def decryptFromString(self, entext):
292
- '''
293
- 从字符串进行AES解密
294
- entext: 数据类型str
295
- '''
296
- mData = MData(characterSet=self.characterSet)
297
- self.data = mData.fromString(entext)
298
- return self.__decrypt()
299
-
300
- def decryptFromBytes(self, entext):
301
- '''
302
- 从二进制进行AES解密
303
- entext: 数据类型bytes
304
- '''
305
- self.data = entext
306
- return self.__decrypt()
307
-
308
- def encryptFromString(self, data):
309
- '''
310
- 对字符串进行AES加密
311
- data: 待加密字符串,数据类型为str
312
- '''
313
- self.data = data.encode(self.characterSet)
314
- return self.__encrypt()
315
-
316
- def __encrypt(self):
317
- if self.mode == AES.MODE_CBC:
318
- aes = AES.new(self.key, self.mode, self.iv)
319
- elif self.mode == AES.MODE_ECB:
320
- aes = AES.new(self.key, self.mode)
321
- else:
322
- print("不支持这种模式")
323
- return
324
-
325
- data = self.__paddingData(self.data)
326
- enData = aes.encrypt(data)
327
- return MData(enData)
328
-
329
- def __decrypt(self):
330
- if self.mode == AES.MODE_CBC:
331
- aes = AES.new(self.key, self.mode, self.iv)
332
- elif self.mode == AES.MODE_ECB:
333
- aes = AES.new(self.key, self.mode)
334
- else:
335
- print("不支持这种模式")
336
- return
337
- data = aes.decrypt(self.data)
338
- mData = MData(self.__stripPaddingData(data), characterSet=self.characterSet)
339
- return mData
340
-
341
-
342
- # if __name__ == '__main__':
343
- # key = b"1234567812345678"
344
- # iv = b"0000000000000000"
345
- # aes = AEScryptor(key, AES.MODE_CBC, iv, paddingMode="ZeroPadding", characterSet='utf-8')
346
- #
347
- # data = "好好学习"
348
- # rData = aes.encryptFromString(data)
349
- # print("密文:", rData.toBase64())
350
- # rData = aes.decryptFromBase64(rData.toBase64())
351
- # print("明文:", rData)
1
+ import base64
2
+ import binascii
3
+
4
+ from Crypto.Util.Padding import pad
5
+ from Crypto.Cipher import AES
6
+
7
+
8
+ class BaseEncode(object):
9
+
10
+ def __init__(self):
11
+ pass
12
+
13
+ @classmethod
14
+ def get_byte_md5_value(cls, bytes):
15
+ """
16
+ 获得byte md5值
17
+ :param bytes:需要操作的二进制
18
+ :return:
19
+ """
20
+ import hashlib
21
+ myMd5 = hashlib.md5(bytes)
22
+ myMd5_Digest = myMd5.hexdigest()
23
+ return myMd5_Digest
24
+
25
+ @classmethod
26
+ def get_md5_value(cls, src):
27
+ """
28
+ 获得字符串md5值
29
+ :param src:需要操作的字符串
30
+ :return:
31
+ """
32
+ import hashlib
33
+ myMd5 = hashlib.md5()
34
+ myMd5.update(src.encode("utf8"))
35
+ myMd5_Digest = myMd5.hexdigest()
36
+ return myMd5_Digest
37
+
38
+ @classmethod
39
+ def get_md5_value_16bit(cls, src):
40
+ """
41
+ 获取16位md5
42
+ :param src:
43
+ :return:
44
+ """
45
+ return cls.get_md5_value(src)[8:-8]
46
+
47
+ @classmethod
48
+ def get_byte_md5_value_16bit(cls, bytes):
49
+ """
50
+ 获取16位md5
51
+ :param bytes:
52
+ :return:
53
+ """
54
+ return cls.get_byte_md5_value(bytes)[8:-8]
55
+
56
+ @classmethod
57
+ def get_sha1_value(cls, src):
58
+ """
59
+ 获得字符串sha1值
60
+ :param src:
61
+ :return:
62
+ """
63
+ import hashlib
64
+ mySha1 = hashlib.sha1()
65
+ mySha1.update(src)
66
+ mySha1_Digest = mySha1.hexdigest()
67
+ return mySha1_Digest
68
+
69
+ @classmethod
70
+ def get_base64(cls, src):
71
+ """
72
+ 输入字符串,编码成base64
73
+ :param src:
74
+ :return:
75
+ """
76
+ strEncode = base64.b64encode(src.encode('utf8')).decode('utf8')
77
+ return strEncode
78
+
79
+ @classmethod
80
+ def base64_get_str(cls, base64_str):
81
+ """
82
+ 输入base64字符串,输出原始字符串
83
+ :param base64_str:
84
+ :return:
85
+ """
86
+ src = base64.b64decode(base64_str.encode('utf8')).decode('utf8')
87
+ return src
88
+
89
+ @classmethod
90
+ def aes_encode(cls, password, text, mode, iv=None):
91
+ """
92
+ https://blog.csdn.net/qq_42334096/article/details/122847876
93
+ 在AES标准规范中,分组长度只能是128位 每个分组为16个字节(每个字节8位)。
94
+ 密钥长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。
95
+ AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
96
+ AES-128 4 4 10
97
+ AES-192 6 4 11
98
+ AES-256 8 4 14
99
+ 填充模式:这是因为如果明文不是128位(16字节)的则需要进行填充,需要将明文补充到16个字节整数倍的长度。在我们进行加解密时需要采用同样的填充方式,
100
+ 否则无法解密成功。填充模式有:No Padding、PKCS5 Padding、PKCS7 Padding、ISO10126 Padding、Ansix923 Padding、Zero Padding等等。
101
+ pip install pycryptodome
102
+ (亲测,目前不用改文件夹名字了) 但是,在使用的时候导包是有问题的,这个时候只要修改一个文件夹的名称就可以完美解决这个问题
103
+ C:\用户\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages
104
+
105
+ 找到这个路径,下面有一个文件夹叫做crypto,将c改成C,对就是改成大写就ok了!
106
+ liunx: pip install pycrypto
107
+ :param password:
108
+ :param text:
109
+ :param mode:
110
+ :return:
111
+ """
112
+ if mode == AES.MODE_ECB:
113
+ assert len(password) % 16 == 0, Exception("密匙 位数应该为16的倍数")
114
+ assert len(text) % 16 == 0, Exception("加密文本 位数应该为16的倍数")
115
+ # MODE_ECB 秘钥必须为16字节或者16字节的倍数的字节型数据。
116
+ # MODE_ECB 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
117
+ aes = AES.new(password, AES.MODE_ECB) # 创建一个aes对象
118
+ # AES.MODE_ECB 表示模式是ECB模式
119
+ en_text = aes.encrypt(text) # 加密明文
120
+ return en_text
121
+ if mode == AES.MODE_CBC:
122
+ # 1. 在Python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量、都需要是bytes(字节型)数据。python 在构建aes对象时也只能接受bytes类型数据。
123
+ # 2.当秘钥,iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。
124
+ # 3. CBC模式需要重新生成AES对象,为了防止这类错误,我写代码无论是什么模式都重新生成AES对象。
125
+ assert iv is not None
126
+ aes = AES.new(password, AES.MODE_CBC, iv) # 创建一个aes对象
127
+ # AES.MODE_CBC 表示模式是CBC模式
128
+ en_text = aes.encrypt(text)
129
+ return en_text
130
+
131
+ @classmethod
132
+ def aes_decode(cls, password, en_text, mode, iv=None):
133
+ """
134
+ :return:
135
+ """
136
+ if mode == AES.MODE_ECB:
137
+ assert len(password) % 16 == 0, Exception("密匙 位数应该为16的倍数")
138
+ assert len(en_text) % 16 == 0, Exception("密文 位数应该为16的倍数")
139
+ aes = AES.new(password, AES.MODE_ECB) # 创建一个aes对象
140
+ # AES.MODE_ECB 表示模式是ECB模式
141
+ text = aes.decrypt(en_text) # 加密明文
142
+ return text
143
+ if mode == AES.MODE_CBC:
144
+ assert iv is not None
145
+ aes = AES.new(password, AES.MODE_CBC, iv) # 创建一个aes对象
146
+ # AES.MODE_CBC 表示模式是CBC模式
147
+ text = aes.decrypt(en_text)
148
+ return text
149
+
150
+
151
+ # 数据类
152
+ class MData():
153
+ def __init__(self, data=b"", characterSet='utf-8'):
154
+ # data肯定为bytes
155
+ self.data = data
156
+ self.characterSet = characterSet
157
+
158
+ def saveData(self, FileName):
159
+ with open(FileName, 'wb') as f:
160
+ f.write(self.data)
161
+
162
+ def fromString(self, data):
163
+ self.data = data.encode(self.characterSet)
164
+ return self.data
165
+
166
+ def fromBase64(self, data):
167
+ self.data = base64.b64decode(data.encode(self.characterSet))
168
+ return self.data
169
+
170
+ def fromHexStr(self, data):
171
+ self.data = binascii.a2b_hex(data)
172
+ return self.data
173
+
174
+ def toString(self):
175
+ return self.data.decode(self.characterSet)
176
+
177
+ def toBase64(self):
178
+ return base64.b64encode(self.data).decode()
179
+
180
+ def toHexStr(self):
181
+ return binascii.b2a_hex(self.data).decode()
182
+
183
+ def toBytes(self):
184
+ return self.data
185
+
186
+ def __str__(self):
187
+ try:
188
+ return self.toString()
189
+ except Exception:
190
+ return self.toBase64()
191
+
192
+
193
+ ### 封装类
194
+ class AEScryptor():
195
+ def __init__(self, key, mode, iv='', paddingMode="NoPadding", characterSet="utf-8"):
196
+ '''
197
+ 构建一个AES对象
198
+ key: 秘钥,字节型数据
199
+ mode: 使用模式,只提供两种,AES.MODE_CBC, AES.MODE_ECB
200
+ iv: iv偏移量,字节型数据
201
+ paddingMode: 填充模式,默认为NoPadding, 可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding
202
+ characterSet: 字符集编码
203
+ '''
204
+ self.key = key
205
+ self.mode = mode
206
+ self.iv = iv
207
+ self.characterSet = characterSet
208
+ self.paddingMode = paddingMode
209
+ self.data = ""
210
+
211
+ def __ZeroPadding(self, data):
212
+ data += b'\x00'
213
+ while len(data) % 16 != 0:
214
+ data += b'\x00'
215
+ return data
216
+
217
+ def __StripZeroPadding(self, data):
218
+ data = data[:-1]
219
+ while len(data) % 16 != 0:
220
+ data = data.rstrip(b'\x00')
221
+ if data[-1] != b"\x00":
222
+ break
223
+ return data
224
+
225
+ def __PKCS5_7Padding(self, data):
226
+ needSize = 16 - len(data) % 16
227
+ if needSize == 0:
228
+ needSize = 16
229
+ return data + needSize.to_bytes(1, 'little') * needSize
230
+
231
+ def __StripPKCS5_7Padding(self, data):
232
+ paddingSize = data[-1]
233
+ return data.rstrip(paddingSize.to_bytes(1, 'little'))
234
+
235
+ def __paddingData(self, data):
236
+ if self.paddingMode == "NoPadding":
237
+ if len(data) % 16 == 0:
238
+ return data
239
+ else:
240
+ return self.__ZeroPadding(data)
241
+ elif self.paddingMode == "ZeroPadding":
242
+ return self.__ZeroPadding(data)
243
+ elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":
244
+ return self.__PKCS5_7Padding(data)
245
+ else:
246
+ print("不支持Padding")
247
+
248
+ def __stripPaddingData(self, data):
249
+ if self.paddingMode == "NoPadding":
250
+ return self.__StripZeroPadding(data)
251
+ elif self.paddingMode == "ZeroPadding":
252
+ return self.__StripZeroPadding(data)
253
+
254
+ elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":
255
+ return self.__StripPKCS5_7Padding(data)
256
+ else:
257
+ print("不支持Padding")
258
+
259
+ def setCharacterSet(self, characterSet):
260
+ '''
261
+ 设置字符集编码
262
+ characterSet: 字符集编码
263
+ '''
264
+ self.characterSet = characterSet
265
+
266
+ def setPaddingMode(self, mode):
267
+ '''
268
+ 设置填充模式
269
+ mode: 可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding
270
+ '''
271
+ self.paddingMode = mode
272
+
273
+ def decryptFromBase64(self, entext):
274
+ '''
275
+ 从base64编码字符串编码进行AES解密
276
+ entext: 数据类型str
277
+ '''
278
+ mData = MData(characterSet=self.characterSet)
279
+ self.data = mData.fromBase64(entext)
280
+ return self.__decrypt()
281
+
282
+ def decryptFromHexStr(self, entext):
283
+ '''
284
+ 从hexstr编码字符串编码进行AES解密
285
+ entext: 数据类型str
286
+ '''
287
+ mData = MData(characterSet=self.characterSet)
288
+ self.data = mData.fromHexStr(entext)
289
+ return self.__decrypt()
290
+
291
+ def decryptFromString(self, entext):
292
+ '''
293
+ 从字符串进行AES解密
294
+ entext: 数据类型str
295
+ '''
296
+ mData = MData(characterSet=self.characterSet)
297
+ self.data = mData.fromString(entext)
298
+ return self.__decrypt()
299
+
300
+ def decryptFromBytes(self, entext):
301
+ '''
302
+ 从二进制进行AES解密
303
+ entext: 数据类型bytes
304
+ '''
305
+ self.data = entext
306
+ return self.__decrypt()
307
+
308
+ def encryptFromString(self, data):
309
+ '''
310
+ 对字符串进行AES加密
311
+ data: 待加密字符串,数据类型为str
312
+ '''
313
+ self.data = data.encode(self.characterSet)
314
+ return self.__encrypt()
315
+
316
+ def __encrypt(self):
317
+ if self.mode == AES.MODE_CBC:
318
+ aes = AES.new(self.key, self.mode, self.iv)
319
+ elif self.mode == AES.MODE_ECB:
320
+ aes = AES.new(self.key, self.mode)
321
+ else:
322
+ print("不支持这种模式")
323
+ return
324
+
325
+ data = self.__paddingData(self.data)
326
+ enData = aes.encrypt(data)
327
+ return MData(enData)
328
+
329
+ def __decrypt(self):
330
+ if self.mode == AES.MODE_CBC:
331
+ aes = AES.new(self.key, self.mode, self.iv)
332
+ elif self.mode == AES.MODE_ECB:
333
+ aes = AES.new(self.key, self.mode)
334
+ else:
335
+ print("不支持这种模式")
336
+ return
337
+ data = aes.decrypt(self.data)
338
+ mData = MData(self.__stripPaddingData(data), characterSet=self.characterSet)
339
+ return mData
340
+
341
+
342
+ # if __name__ == '__main__':
343
+ # key = b"1234567812345678"
344
+ # iv = b"0000000000000000"
345
+ # aes = AEScryptor(key, AES.MODE_CBC, iv, paddingMode="ZeroPadding", characterSet='utf-8')
346
+ #
347
+ # data = "好好学习"
348
+ # rData = aes.encryptFromString(data)
349
+ # print("密文:", rData.toBase64())
350
+ # rData = aes.decryptFromBase64(rData.toBase64())
351
+ # print("明文:", rData)