from
socket
import
*
from
Crypto.Cipher
import
AES
import
base64
from
binascii
import
*
from
struct
import
*
import
ctypes
from
hexdump
import
*
from
Crypto.
Hash
import
SHA256
from
Crypto.
Hash
import
SHA
from
zlib
import
crc32
BLOCK_SIZE
=
16
pad
=
lambda
s: s
+
(BLOCK_SIZE
-
len
(s)
%
BLOCK_SIZE)
*
\
chr
(BLOCK_SIZE
-
len
(s)
%
BLOCK_SIZE)
unpad
=
lambda
s: s[:
-
ord
(s[
len
(s)
-
1
:])]
def
aesEncrypt(key,iv, data):
cipher
=
AES.new(key, AES.MODE_CBC,iv)
result
=
cipher.encrypt(data)
enctext
=
result
return
enctext
def
aesDecrypt(key,iv, data):
cipher
=
AES.new(key, AES.MODE_CBC,iv)
text_decrypted
=
cipher.decrypt(data)
return
text_decrypted
def
packet(data):
size
=
len
(data)
lenth
=
pack(
'I'
,size)
crcdata
=
pack(
'I'
,(crc32(data)&
0xffffffff
))
junkdata
=
a2b_hex(
'E71EBC2729DE4EEB224B234C32477FDD'
)
final_packet
=
data
+
junkdata
+
lenth
+
crcdata
return
final_packet
def
encrypt_codemeter_msg(data,tick):
ori_var
=
tick
/
/
1000
ori_var1
=
ori_var
*
1000
ori_var2
=
(ori_var1
/
/
1009
)
skey1
=
SHA.new(pack(
'I'
,ori_var2)).digest()
key
=
skey1[
0
:
16
]
vi
=
skey1[
4
:
20
]
encrypt_data
=
aesEncrypt(key,vi,data)
size
=
len
(encrypt_data)
invrt_data1
=
encrypt_data[
0
:size
-
32
]
invrt_data2
=
encrypt_data[
-
32
:
-
16
]
invrt_data3
=
encrypt_data[
-
16
:]
final_encrypt
=
invrt_data1
+
invrt_data3
+
invrt_data2
return
final_encrypt
if
__name__
=
=
'__main__'
:
with
open
(
'datatest.bin'
,
'rb'
) as fd:
data_test
=
fd.read()
msg
=
encrypt_codemeter_msg(packet(data_test),
0x019e5cb8
)
hexdump(msg)