树莓派上的转发脚本 smsForward.py

代码全览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys

import requests
from pyDes import des, PAD_PKCS5, ECB


# 加密函数 密钥是19960621
# 返回值是十六进制字符串
def encrypt(text):
key = '19960621'
# 为了防止中文乱码,要先转化为字节
b_text = text.encode()
des_obj = des(key, ECB, key, padmode=PAD_PKCS5) # 初始化一个des对象,参数是秘钥,加密方式,偏移, 填充方式
secret_bytes = des_obj.encrypt(b_text) # 用对象的encrypt方法加密
return secret_bytes.hex()


# 向服务器发送请求
def send_message(name, content):
datas = {"name": name, "content": content}
requests.post("http://119.23.211.66:8080/putmessage", data=datas)


# 读取文件并返回String
def read_file(path):
data = ''
with open(path, 'r', encoding='utf-8') as f:
for line in f.readlines():
line = line.strip()
data += line
return data


# 脚本入口
if __name__ == '__main__':
# 参数为文件名
file_name = sys.argv[1]
# 读取文件内容
content = read_file("/var/spool/gammu/inbox/" + file_name)
# 在name后面加上_0805再加密,过滤错误请求
file_name = file_name + "_0805"
send_message(encrypt(file_name), encrypt(content))

主要代码分析

gammu-smsd模块收到短信后触发smsForward.Pytorch脚本,其参数就是短信文件名,故可以通过文件名拿到短信内容,同时文件名中包含了时间及发信人等信息。

DES加密

客户端与服务端皆采用了DES对称加密,防止内容被曝光,客户端Python脚本使用pyDes进行加密,加密结束后返回16进制的字符串内容。

post请求

通过requests包发起post请求,有两个参数,name穿文件名,content穿短信内容

过滤错误请求

因为此接口未做权限校验,为了防止其他人随意发送乱码攻击接口,对文件名加上_0805后再加密,后端解密的内容如果没有这个校验值就不存进数据库。