re-common 10.0.37__py3-none-any.whl → 10.0.39__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.
- re_common/baselibrary/__init__.py +4 -4
- re_common/baselibrary/baseabs/__init__.py +6 -6
- re_common/baselibrary/baseabs/baseabs.py +26 -26
- re_common/baselibrary/database/mbuilder.py +132 -132
- re_common/baselibrary/database/moudle.py +93 -93
- re_common/baselibrary/database/msqlite3.py +194 -194
- re_common/baselibrary/database/mysql.py +169 -169
- re_common/baselibrary/database/sql_factory.py +26 -26
- re_common/baselibrary/mthread/MThreadingRun.py +486 -486
- re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
- re_common/baselibrary/mthread/__init__.py +2 -2
- re_common/baselibrary/mthread/mythreading.py +695 -695
- re_common/baselibrary/pakge_other/socks.py +404 -404
- re_common/baselibrary/readconfig/config_factory.py +18 -18
- re_common/baselibrary/readconfig/ini_config.py +317 -317
- re_common/baselibrary/readconfig/toml_config.py +49 -49
- re_common/baselibrary/temporary/envdata.py +36 -36
- re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
- re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
- re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
- re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
- re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
- re_common/baselibrary/tools/contrast_db3.py +123 -123
- re_common/baselibrary/tools/copy_file.py +39 -39
- re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
- re_common/baselibrary/tools/foreachgz.py +39 -39
- re_common/baselibrary/tools/get_attr.py +10 -10
- re_common/baselibrary/tools/image_to_pdf.py +61 -61
- re_common/baselibrary/tools/java_code_deal.py +139 -139
- re_common/baselibrary/tools/javacode.py +79 -79
- re_common/baselibrary/tools/mdb_db3.py +48 -48
- re_common/baselibrary/tools/merge_file.py +171 -171
- re_common/baselibrary/tools/merge_gz_file.py +165 -165
- re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
- re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
- re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
- re_common/baselibrary/tools/mongo_tools.py +50 -50
- re_common/baselibrary/tools/move_file.py +170 -170
- re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
- re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
- re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
- re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
- re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
- re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
- re_common/baselibrary/tools/myparsel.py +104 -104
- re_common/baselibrary/tools/rename_dir_file.py +37 -37
- re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
- re_common/baselibrary/tools/split_line_to_many.py +25 -25
- re_common/baselibrary/tools/stringtodicts.py +33 -33
- re_common/baselibrary/tools/workwechant_bot.py +84 -84
- re_common/baselibrary/utils/baseaiohttp.py +296 -296
- re_common/baselibrary/utils/baseaiomysql.py +87 -87
- re_common/baselibrary/utils/baseallstep.py +191 -191
- re_common/baselibrary/utils/baseavro.py +19 -19
- re_common/baselibrary/utils/baseboto3.py +291 -291
- re_common/baselibrary/utils/basecsv.py +32 -32
- re_common/baselibrary/utils/basedict.py +133 -133
- re_common/baselibrary/utils/basedir.py +241 -241
- re_common/baselibrary/utils/baseencode.py +351 -351
- re_common/baselibrary/utils/baseencoding.py +28 -28
- re_common/baselibrary/utils/baseesdsl.py +86 -86
- re_common/baselibrary/utils/baseexcel.py +264 -264
- re_common/baselibrary/utils/baseexcept.py +109 -109
- re_common/baselibrary/utils/basefile.py +654 -654
- re_common/baselibrary/utils/baseftp.py +214 -214
- re_common/baselibrary/utils/basegzip.py +60 -60
- re_common/baselibrary/utils/basehdfs.py +135 -135
- re_common/baselibrary/utils/basehttpx.py +268 -268
- re_common/baselibrary/utils/baseip.py +87 -87
- re_common/baselibrary/utils/basejson.py +2 -2
- re_common/baselibrary/utils/baselist.py +32 -32
- re_common/baselibrary/utils/basemotor.py +190 -190
- re_common/baselibrary/utils/basemssql.py +98 -98
- re_common/baselibrary/utils/baseodbc.py +113 -113
- re_common/baselibrary/utils/basepandas.py +302 -302
- re_common/baselibrary/utils/basepeewee.py +11 -11
- re_common/baselibrary/utils/basepika.py +180 -180
- re_common/baselibrary/utils/basepydash.py +143 -143
- re_common/baselibrary/utils/basepymongo.py +230 -230
- re_common/baselibrary/utils/basequeue.py +22 -22
- re_common/baselibrary/utils/baserar.py +57 -57
- re_common/baselibrary/utils/baserequest.py +279 -279
- re_common/baselibrary/utils/baseset.py +8 -8
- re_common/baselibrary/utils/basesmb.py +403 -403
- re_common/baselibrary/utils/basestring.py +382 -382
- re_common/baselibrary/utils/basetime.py +320 -320
- re_common/baselibrary/utils/baseurl.py +121 -121
- re_common/baselibrary/utils/basezip.py +57 -57
- re_common/baselibrary/utils/core/__init__.py +7 -7
- re_common/baselibrary/utils/core/bottomutils.py +18 -18
- re_common/baselibrary/utils/core/mdeprecated.py +327 -327
- re_common/baselibrary/utils/core/mlamada.py +16 -16
- re_common/baselibrary/utils/core/msginfo.py +25 -25
- re_common/baselibrary/utils/core/requests_core.py +103 -103
- re_common/baselibrary/utils/fateadm.py +429 -429
- re_common/baselibrary/utils/importfun.py +123 -123
- re_common/baselibrary/utils/mfaker.py +57 -57
- re_common/baselibrary/utils/my_abc/__init__.py +3 -3
- re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
- re_common/baselibrary/utils/mylogger.py +414 -414
- re_common/baselibrary/utils/myredisclient.py +861 -861
- re_common/baselibrary/utils/pipupgrade.py +21 -21
- re_common/baselibrary/utils/ringlist.py +85 -85
- re_common/baselibrary/utils/version_compare.py +36 -36
- re_common/baselibrary/utils/ydmhttp.py +126 -126
- re_common/facade/lazy_import.py +11 -11
- re_common/facade/loggerfacade.py +25 -25
- re_common/facade/mysqlfacade.py +467 -467
- re_common/facade/now.py +31 -31
- re_common/facade/sqlite3facade.py +257 -257
- re_common/facade/use/mq_use_facade.py +83 -83
- re_common/facade/use/proxy_use_facade.py +19 -19
- re_common/libtest/base_dict_test.py +19 -19
- re_common/libtest/baseavro_test.py +13 -13
- re_common/libtest/basefile_test.py +14 -14
- re_common/libtest/basemssql_test.py +77 -77
- re_common/libtest/baseodbc_test.py +7 -7
- re_common/libtest/basepandas_test.py +38 -38
- re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
- re_common/libtest/get_attr_test/settings.py +54 -54
- re_common/libtest/idencode_test.py +53 -53
- re_common/libtest/iniconfig_test.py +35 -35
- re_common/libtest/ip_test.py +34 -34
- re_common/libtest/merge_file_test.py +20 -20
- re_common/libtest/mfaker_test.py +8 -8
- re_common/libtest/mm3_test.py +31 -31
- re_common/libtest/mylogger_test.py +88 -88
- re_common/libtest/myparsel_test.py +27 -27
- re_common/libtest/mysql_test.py +151 -151
- re_common/libtest/pymongo_test.py +21 -21
- re_common/libtest/split_test.py +11 -11
- re_common/libtest/sqlite3_merge_test.py +5 -5
- re_common/libtest/sqlite3_test.py +34 -34
- re_common/libtest/tomlconfig_test.py +30 -30
- re_common/libtest/use_tools_test/__init__.py +2 -2
- re_common/libtest/user/__init__.py +4 -4
- re_common/studio/__init__.py +4 -4
- re_common/studio/assignment_expressions.py +36 -36
- re_common/studio/mydash/test1.py +18 -18
- re_common/studio/pydashstudio/first.py +9 -9
- re_common/studio/streamlitstudio/first_app.py +65 -65
- re_common/studio/streamlitstudio/uber_pickups.py +23 -23
- re_common/studio/test.py +18 -18
- re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +219 -219
- re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
- re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
- re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
- re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
- re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/concurrency.py +35 -35
- re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
- re_common/v2/baselibrary/tools/data_processer/data_processer.py +508 -508
- re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
- re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
- re_common/v2/baselibrary/tools/dict_tools.py +44 -44
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
- re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
- re_common/v2/baselibrary/tools/list_tools.py +69 -69
- re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
- re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
- re_common/v2/baselibrary/tools/text_matcher.py +326 -326
- re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
- re_common/v2/baselibrary/utils/author_smi.py +361 -361
- re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
- re_common/v2/baselibrary/utils/basedict.py +37 -37
- re_common/v2/baselibrary/utils/basehdfs.py +163 -163
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +77 -77
- re_common/v2/baselibrary/utils/db.py +156 -156
- re_common/v2/baselibrary/utils/json_cls.py +16 -16
- re_common/v2/baselibrary/utils/mq.py +83 -83
- re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
- re_common/v2/baselibrary/utils/string_bool.py +186 -186
- re_common/v2/baselibrary/utils/string_clear.py +246 -246
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +271 -278
- re_common/vip/base_step_process.py +11 -11
- re_common/vip/baseencodeid.py +90 -90
- re_common/vip/changetaskname.py +28 -28
- re_common/vip/core_var.py +24 -24
- re_common/vip/mmh3Hash.py +89 -89
- re_common/vip/proxy/allproxys.py +127 -127
- re_common/vip/proxy/allproxys_thread.py +159 -159
- re_common/vip/proxy/cnki_proxy.py +153 -153
- re_common/vip/proxy/kuaidaili.py +87 -87
- re_common/vip/proxy/proxy_all.py +113 -113
- re_common/vip/proxy/update_kuaidaili_0.py +42 -42
- re_common/vip/proxy/wanfang_proxy.py +152 -152
- re_common/vip/proxy/wp_proxy_all.py +181 -181
- re_common/vip/read_rawid_to_txt.py +91 -91
- re_common/vip/title/__init__.py +5 -5
- re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
- re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
- re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
- re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
- re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
- re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
- re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
- re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
- re_common/vip/title/transform/__init__.py +10 -10
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/LICENSE +201 -201
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/METADATA +16 -16
- re_common-10.0.39.dist-info/RECORD +248 -0
- {re_common-10.0.37.dist-info → re_common-10.0.39.dist-info}/WHEEL +1 -1
- re_common-10.0.37.dist-info/RECORD +0 -248
- {re_common-10.0.37.dist-info → re_common-10.0.39.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)
|