CRC and REM. USERS

This commit is contained in:
german 2025-12-28 19:43:22 +04:00
parent 6aabbf77c3
commit c0d863ef48
10 changed files with 102 additions and 33 deletions

33
DOCS.md
View File

@ -2,8 +2,8 @@
- [Установка](#установка) - [Установка](#установка)
- [Шифрование](#шифрование) - [Шифрование](#шифрование)
- [Регистрация ключа](#регистрация-ключа) - [Регистрация ключа](#регистрация-ключа)
- [Создание пользователя и шифрование](#создание-пользователя-и-шифрование) - [Команда шифрования](#команда-шифрования)
- [Чтение данных пользователя и расшифровка](#чтение-данных-пользователя-и-расшифровка) - [Расшифровка](#расшифровка)
- [Опции команды](#опции-команды) - [Опции команды](#опции-команды)
- [API](#api) - [API](#api)
## Установка ## Установка
@ -27,7 +27,7 @@ make update
vipre-cryptor --version vipre-cryptor --version
``` ```
## Шифрование ## Шифрование
Для шифрования программа требует создать локального пользователя, зарегистрировать электронный ключ и привязать к пользователю зашифрованный ключом файл. Для шифрования программа требует зарегистрировать электронный ключ и привязать к нему зашифрованный файл.
## Регистрация ключа ## Регистрация ключа
Ключ можно создать с помощью OpenSSL: Ключ можно создать с помощью OpenSSL:
```bash ```bash
@ -41,18 +41,16 @@ openssl rand -base64 30
vipre-cryptor --sig ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig vipre-cryptor --sig ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig
``` ```
Данная команда запросит ваш ключ и запишет его в файл **ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig** особым образом. Данная команда запросит ваш ключ и запишет его в файл **ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig** особым образом.
## Создание пользователя и шифрование ## Команда шифрования
Создание пользователя и шифрование файла выглядит следующим образом: Шифрование файла выглядит следующим образом:
```bash ```bash
vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --create-user ИМЯ_ПОЛЬЗОВАТЕЛЯ.bin --file-input ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --create-user ИМЯ_ЗАШИФРОВАННОГОАЙЛА.bin --file-input ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ
``` ```
Данная команда запросит логин и пароль нового пользователя. ## Расшифровка
## Чтение данных пользователя и расшифровка
Для чтения данных необходимо выполнить команду: Для чтения данных необходимо выполнить команду:
```bash ```bash
vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬЗОВАТЕЛЯ.bin --file-out ФАЙЛ_РАСШИФРОВАННЫХАННЫХ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ЗАШИФРОВАННОГОАЙЛА.bin --file-out ФАЙЛ_РАСШИФРОВАННЫХАННЫХ
``` ```
Данная команда запросит логин и пароль пользователя.
## Опции команды ## Опции команды
Доступны опции: Доступны опции:
- **--help** - **--help**
@ -62,12 +60,15 @@ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬ
- **--sig** - **--sig**
- **--file-input** - **--file-input**
- **--file-out** - **--file-out**
- **--type=users**
Все опции можно сокращать до одного знака, например: Все опции можно сокращать до одного знака, например:
```ini ```ini
# Опции "--file-input" и "--file-out" можно сократить до "--file" или просто "-f" # Опции "--file-input" и "--file-out" можно сократить до "--file" или просто "-f"
"--help" - "-h" [options]
"--version" - "-v" "--help" = "-h"
"--version" = "-v"
"--type=users" = "-t"
``` ```
## API ## API
У библиотеки есть **API**: У библиотеки есть **API**:
@ -76,11 +77,11 @@ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬ
#include "vipre-manager.h" #include "vipre-manager.h"
int main(void) { int main(void) {
__set_api_mode("admin", "1234", "signature_key"); __set_api_mode(NULL, NULL, "signature_key");
__create_sig("api_example_key.sig"); __create_sig("api_example_key.sig");
__create_user("api_example_key.sig", "api_example_user.bin", "example.txt"); __create_user("api_example_key.sig", "api_example_file.bin", "example.txt");
__read_user("api_example_key.sig", "api_example_user.bin", "example_out.txt"); __read_user("api_example_key.sig", "api_example_file.bin", "example_out.txt");
__api_detach(); __api_detach();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
``` ```

View File

@ -29,16 +29,24 @@ REMOVE=rm
INSTALL_NAME=/usr/local/bin/vipre-cryptor INSTALL_NAME=/usr/local/bin/vipre-cryptor
MODE=chmod +x MODE=chmod +x
RUN_OF=./ RUN_OF=./
API_NAME=api_example.c
API_OUT_NAME=api_example
.PHONY: clear run install uninstall update .PHONY: clear run install uninstall update api run-api $(OUTPUT_NAME)
$(OUTPUT_NAME): $(INPUT_NAME) $(OUTPUT_NAME): $(INPUT_NAME)
$(CC) $(OPTIONS) $(INPUT_NAME) -o $(OUTPUT_NAME) $(CC) $(OPTIONS) $(INPUT_NAME) -o $(OUTPUT_NAME)
api:
$(CC) $(OPTIONS) $(API_NAME) -o $(API_OUT_NAME)
clear: clear:
$(REMOVE) -f $(OUTPUT_NAME) $(REMOVE) -f $(OUTPUT_NAME)
$(REMOVE) -f $(API_OUT_NAME)
run: run:
$(MODE) $(OUTPUT_NAME) $(MODE) $(OUTPUT_NAME)
$(RUN_OF)$(OUTPUT_NAME) $(RUN_OF)$(OUTPUT_NAME)
run-api:
$(MODE) $(API_OUT_NAME)
$(RUN_OF)$(API_OUT_NAME)
install: install:
$(COPY) $(OUTPUT_NAME) $(INSTALL_NAME) $(COPY) $(OUTPUT_NAME) $(INSTALL_NAME)
uninstall: uninstall:

Binary file not shown.

View File

@ -2,10 +2,10 @@
#include "vipre-manager.h" #include "vipre-manager.h"
int main(void) { int main(void) {
__set_api_mode("admin", "1234", "signature_key"); __set_api_mode(NULL, NULL, "signature_key");
__create_sig("api_example_key.sig"); __create_sig("api_example_key.sig");
__create_user("api_example_key.sig", "api_example_user.bin", "example.txt"); __create_user("api_example_key.sig", "api_example_file.bin", "example.txt");
__read_user("api_example_key.sig", "api_example_user.bin", "example_out.txt"); __read_user("api_example_key.sig", "api_example_file.bin", "example_out.txt");
__api_detach(); __api_detach();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

Binary file not shown.

BIN
key.sig

Binary file not shown.

BIN
user.bin

Binary file not shown.

0
user_test.bin Normal file
View File

Binary file not shown.

View File

@ -28,6 +28,9 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#define LIB_TRUE 1
#define LIB_FALSE 0
#define VERSION "1.0" #define VERSION "1.0"
#define ERROR_FILE_OUT "unnamed_out_file.csv" #define ERROR_FILE_OUT "unnamed_out_file.csv"
@ -39,6 +42,7 @@ char* __YEFWHD_api_login = NULL;
char* __YEFWHD_api_password = NULL; char* __YEFWHD_api_password = NULL;
char* __YEFWHD_api_datakey = NULL; char* __YEFWHD_api_datakey = NULL;
char __YEFWHD_data_type = '\0'; char __YEFWHD_data_type = '\0';
bool __YEFWHD_users = false;
#define VIPRE_API_MODE 'A' #define VIPRE_API_MODE 'A'
@ -55,6 +59,10 @@ void __set_api_mode(char* login, char* password, char* data_key) {
__YEFWHD_data_type = VIPRE_API_MODE; __YEFWHD_data_type = VIPRE_API_MODE;
} }
void __use_users(bool is_use_users) {
__YEFWHD_users = is_use_users;
}
void _put_vipre_help(void) { void _put_vipre_help(void) {
puts ( puts (
"Vipre Console Cryptor V " VERSION "\n" "Vipre Console Cryptor V " VERSION "\n"
@ -190,7 +198,7 @@ int __create_user(char* file, char* user_file, char* cry_file) {
char user_login[32]; char user_login[32];
char password[32]; char password[32];
int c; int c;
if (__YEFWHD_data_type != VIPRE_API_MODE) { if (__YEFWHD_data_type != VIPRE_API_MODE && __YEFWHD_users == true) {
fputs("Login: ", stdout); fputs("Login: ", stdout);
size_t cnt = 0; size_t cnt = 0;
while((c=getchar())!=EOF && cnt < 31 && c != '\n') { while((c=getchar())!=EOF && cnt < 31 && c != '\n') {
@ -221,10 +229,15 @@ int __create_user(char* file, char* user_file, char* cry_file) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} else { } else {
strncpy(user_login, __YEFWHD_api_login, 31); if (__YEFWHD_users == false) {
strncpy(password, __YEFWHD_api_password, 31); strcpy(user_login, "admin");
user_login[31] = '\0'; strcpy(password, "1234");
password[31] = '\0'; } else {
strncpy(user_login, __YEFWHD_api_login, 31);
strncpy(password, __YEFWHD_api_password, 31);
user_login[31] = '\0';
password[31] = '\0';
}
} }
fputs(user_login, wp); putc('\n', wp); fputs(user_login, wp); putc('\n', wp);
fputs(password, wp); putc('\n', wp); fputs(password, wp); putc('\n', wp);
@ -232,6 +245,22 @@ int __create_user(char* file, char* user_file, char* cry_file) {
unsigned long file_size = ftell(fw); unsigned long file_size = ftell(fw);
rewind(fw); rewind(fw);
unsigned long count = 0; unsigned long count = 0;
unsigned char crc = 0xFF;
while (count < file_size) {
crc ^= (unsigned char)getc(fw);
unsigned short int i = 0;
while (i < 8) {
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
i ++;
}
count ++;
}
putc((char)crc, wp);
fprintf(wp, "%lu\n", count);
rewind(fw);
count = 0;
while (count < file_size) { while (count < file_size) {
c = (char)getc(fw); c = (char)getc(fw);
c = arr[(unsigned char)c]; c = arr[(unsigned char)c];
@ -263,21 +292,33 @@ int __read_user(char* file, char* user_file, char* cry_file) {
char password[32]; char password[32];
char correct_password[32]; char correct_password[32];
char* res; char* res;
unsigned char crc_file = 0xFF;
res = fgets(correct_login, 32, up); res = fgets(correct_login, 32, up);
res = fgets(correct_password, 32, up); res = fgets(correct_password, 32, up);
if (__YEFWHD_data_type != VIPRE_API_MODE) { crc_file = (unsigned char)fgetc(up);
unsigned long read_sum = 0;
res = (char*)(unsigned long int)fscanf(up, "%lu\n", &read_sum);
if (__YEFWHD_data_type != VIPRE_API_MODE && __YEFWHD_users == true) {
fputs("Login: ", stdout); fputs("Login: ", stdout);
res = fgets(user_login, 32, stdin); res = fgets(user_login, 32, stdin);
fputs("Password: ", stdout); fputs("Password: ", stdout);
res = fgets(password, 32, stdin); res = fgets(password, 32, stdin);
} else { } else {
strncpy(user_login, __YEFWHD_api_login, 31); if (__YEFWHD_users == false) {
strncpy(password, __YEFWHD_api_password, 31); strcpy(user_login, "admin");
user_login[31] = '\0'; strcpy(password, "1234");
password[31] = '\0'; } else {
strncpy(user_login, __YEFWHD_api_login, 31);
strncpy(password, __YEFWHD_api_password, 31);
user_login[31] = '\0';
password[31] = '\0';
}
} }
if (res); if (res == NULL) {
puts("\033[1mvipre-cryptor: \033[91mThe file is in the wrong format!\033[0m");
free(arr);
return EXIT_FAILURE;
};
__nl_del(user_login); __nl_del(password); __nl_del(user_login); __nl_del(password);
__nl_del(correct_login); __nl_del(correct_password); __nl_del(correct_login); __nl_del(correct_password);
if (user_login[strlen(user_login) - 1] == '\n') user_login[strlen(user_login) - 1] = '\0'; if (user_login[strlen(user_login) - 1] == '\n') user_login[strlen(user_login) - 1] = '\0';
@ -292,12 +333,26 @@ int __read_user(char* file, char* user_file, char* cry_file) {
fseek(up, save_pos, SEEK_SET); fseek(up, save_pos, SEEK_SET);
unsigned long pos = 0; unsigned long pos = 0;
int c; int c;
unsigned char crc = 0xFF;
while (pos < data_size) { while (pos < data_size) {
c = getc(up); c = getc(up);
c = __find_arr_index(c, arr, arr_len); c = __find_arr_index(c, arr, arr_len);
__refresh_data(arr, arr_len, abs(arr[0])); __refresh_data(arr, arr_len, abs(arr[0]));
putc(c, fw); putc(c, fw);
pos ++; pos ++;
crc ^= (unsigned char)c;
unsigned short int i = 0;
while (i < 8) {
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
i ++;
}
}
if (crc != crc_file || read_sum != pos) {
puts("\033[1mvipre-cryptor: \033[91mVerification error! Request the data again.\033[0m");
free(arr);
return EXIT_FAILURE;
} }
fclose(fp); fclose(fp);
fclose(up); fclose(up);
@ -314,6 +369,7 @@ int parse_file_data(int argc, char** argv) {
bool create_user = false; bool create_user = false;
bool create_sig = false; bool create_sig = false;
bool read_user = false; bool read_user = false;
bool users = false;
char* cry_file = NULL; char* cry_file = NULL;
bool read_cry_file = false; bool read_cry_file = false;
while (n < argc) { while (n < argc) {
@ -342,6 +398,9 @@ int parse_file_data(int argc, char** argv) {
case 'f': case 'f':
read_cry_file = true; read_cry_file = true;
break; break;
case 't':
users = true;
break;
default: default:
printf("\033[1mvipre-cryptor: \033[91mUnknown option \"%s\"!\033[0m\n", str); printf("\033[1mvipre-cryptor: \033[91mUnknown option \"%s\"!\033[0m\n", str);
return EXIT_FAILURE; return EXIT_FAILURE;
@ -355,6 +414,7 @@ int parse_file_data(int argc, char** argv) {
} }
n ++; n ++;
} }
__YEFWHD_users = users;
if (file == NULL) { if (file == NULL) {
puts("\033[1mvipre-cryptor: \033[91mNo input file!\033[0m"); puts("\033[1mvipre-cryptor: \033[91mNo input file!\033[0m");
return EXIT_FAILURE; return EXIT_FAILURE;