· 6 years ago · Sep 17, 2019, 01:46 PM
1// Модуль криптовки данных
2const crypto = require('crypto');
3
4// Модуль WebSocket
5const WebSocket = require('ws');
6
7const fs = require('fs');
8
9// Алгоритм для дешифровки
10const algorithm = 'aes-256-cbc';
11
12// iv - нужен для дешифровки
13const iv = '1234567890123456';
14
15// Секретный ключ для дешифровки
16const secretKey = '123123123';
17
18// Объект с данными пользователя
19const userData = {
20 login: 'MoloF',
21 password: 'Maksim5112',
22 binding: '08907793-58456G08-08236295',
23 version: '1.0.0'
24};
25
26// Временная переменная для токена
27let tempToken = '';
28// Перебор всех значений из объекта пользователя и их сложение в одну строку.
29Object.keys(userData).forEach(function (item) {
30 return tempToken += userData[item];
31});
32
33// Создание подписи (токена), для неизменяемости данных на клиенте.
34const token = crypto
35 // Тип: sha256 и Секретный ключ
36 .createHmac('sha256', secretKey)
37 // Строка
38 .update(tempToken)
39 // Алгоритм
40 .digest('hex');
41
42
43
44// Создание вебсокет клиента с указанием адреса (ws://ip:port) где ws - http протокол, wss - https.
45const ws = new WebSocket('ws://127.0.0.1:1488', {
46 headers : {
47 login: userData.login,
48 password: userData.password,
49 binding: userData.binding,
50 version: userData.version,
51 token: token
52 }
53});
54
55// Отслеживание ошибки подключения, в случае неудачи выведется сообщение об ошибке.
56ws.on('error', (error) => console.log(error.message));
57
58// После подключения к сокету вся логика производится здесь
59ws.on('open',() => {
60 console.log('Успешно подключился к серверу');
61
62 console.log('Запрашиваю информацию о пользователе!');
63 ws.send(sendData('info'));
64
65 console.log('Запрашиваю зашифрованную по паролю dll!');
66 ws.send(sendData('download'));
67
68 ws.on('message', (msg) => {
69
70 const response = JsonParse(msg);
71 if (response === false)
72 return console.log('Неверный формат данных. [JSON]');
73
74 // Все типы обработчиков.
75 switch (response.type) {
76 case 'info':
77 // Обработчик информации о юзере.
78 handleInfo(response.message);
79 break;
80
81 case 'download':
82 // Обработка файла (длл).
83 handleDownload(response.message);
84 break;
85
86 default:
87 console.error('Необработанный ответ от сервера.');
88 break;
89 }
90 });
91});
92
93
94function handleInfo(response) {
95 console.log(response);
96}
97function handleDownload(response) {
98 const decrypt = decryptFile(response);
99 fs.writeFile("./files/decrypt.jpg", decrypt, function(err) {
100 if(err) {
101 return console.log(err);
102 }
103 console.log("Успешно декрпитовал и сохранил файл!");
104 });
105}
106
107function decryptFile(encryptData) {
108 const encryptNewData = Buffer.from(encryptData);
109 const key = crypto.createHash('sha256').update(secretKey).digest();
110 const decipher = crypto.createDecipheriv(algorithm, key, iv);
111 return Buffer.concat([
112 decipher.update(encryptNewData),
113 decipher.final()
114 ]);
115}
116
117function sendData(type, message = null){
118 return JSON.stringify({
119 type,
120 message
121 });
122}
123function JsonParse(str) {
124 try { return JSON.parse(str); } catch (e) { return false; }
125}