Для создания комплекта поставки заказчику программного обеспечения шифрованной связи Extra Systems Cypher Net нами создано несколько скриптов для оболочки bash, которые полностью автоматизируют данный процесс (и исключают появление ошибок). Первый из этих скриптов make_client.sh предназначенный для создания нового клиента (снабженного персональными ключами шифрованной связи RSA) имеет такой текст:
#!/bin/bash RSA_KEY_SIZE=1024 PRIME_SIZE=$(($RSA_KEY_SIZE / 2)) CLIENT_NUMBER=$1 [ -d $CLIENT_NUMBER ] || mkdir $CLIENT_NUMBER echo "Создаем ключи RSA длиной $RSA_KEY_SIZE бит для клиента №$CLIENT_NUMBER" PR1=$(openssl prime $(openssl prime -generate -bits $PRIME_SIZE) | cut -f1 -d ' ') PR2=$(openssl prime $(openssl prime -generate -bits $PRIME_SIZE) | cut -f1 -d ' ') PR3=$(openssl prime $(openssl prime -generate -bits $PRIME_SIZE) | cut -f1 -d ' ') ./keygen $PR1 $PR2 $PR3 > all.txt head -n 1 all.txt > public_$CLIENT_NUMBER tail -n 1 all.txt > private_$CLIENT_NUMBER rm all.txt ./rsa_key_bin public_$CLIENT_NUMBER rm public_$CLIENT_NUMBER ./rsa_key_bin private_$CLIENT_NUMBER rm private_$CLIENT_NUMBER mv private_$CLIENT_NUMBER.bin $CLIENT_NUMBER mv public_$CLIENT_NUMBER.bin $CLIENT_NUMBER cp input $CLIENT_NUMBER cp output $CLIENT_NUMBER
Как видно из текста, в этом скрипте мы получаем три простых числа нужной разрядности (512 бит) от openssl и передаем их процедуре keygen которая создает на их базе открытый и закрытый ключ RSA (1024 бит) для данного клиента (первые два простых числа перемножаются для получения основания обоих ключей, а третье используется как показатель степени для открытого ключа; показатель степени закрытого ключа, как и положено стандартами RSA, вычисляется утилитой keygen с применением расширенного алгоритма Евклида). Вместе с утилитами input и output эти ключи (открытый и закрытый) перемещаются этим скриптом в каталог, созданный для передачи всех этих материалов заказчику.
Процедура rsa_key_bin служит для перевода ключей RSA из текстового вида в двоичный (изначальная генерация ключей RSA в текстовом виде в Extra Systems Cypher Net сложилась исторически; в принципе, это никому не мешает).
Второй скрипт make_link.sh предназначенный для создания связи между парой клиентов имеет такой текст:
#!/bin/bash TMP_DIR_LIST="fingerprints" for NEED_TMP_DIR in $TMP_DIR_LIST do [ -d $NEED_TMP_DIR ] || mkdir $NEED_TMP_DIR done for CLIENT_NUMBER in $1 $2 do [ -d $CLIENT_NUMBER ] || mkdir $CLIENT_NUMBER done cp $1/public_$1.bin $2 cp $2/public_$2.bin $1 ./fingerprint $1 $2 || exit ./fingerprint $2 $1 || exit mv ./fingerprints/fingerprint_i_$1_$2 ./$1 mv ./fingerprints/fingerprint_o_$1_$2 ./$1 mv ./fingerprints/fingerprint_i_$2_$1 ./$2 mv ./fingerprints/fingerprint_o_$2_$1 ./$2 for NEED_TMP_DIR in $TMP_DIR_LIST do [ -d $NEED_TMP_DIR ] && rmdir $NEED_TMP_DIR done
Этот скрипт копирует открытый ключ RSA в каталог партнера и создает для данной пары необходимые файлы fingerprint которые также помещает в соответствующие пользовательские каталоги. Только после этого связь между этими клиентами через наш сервер становится возможной.
С помощью этих двух скриптов, в принципе, можно было бы выполнить любую работу по комплектованию заказа, но для полного удобства мы создали еще и третий скрипт, который позволяет сделать все одним движением. Этот скрипт имеет название make_product.sh и позволяет создать не только пару, но и целую сеть связи:
#!/bin/bash for CLIENT_NUMBER in $@ do ./make_client.sh $CLIENT_NUMBER done COUNER_1=1 for CLIENT_NUMBER_1 in $@ do COUNER_2=1 for CLIENT_NUMBER_2 in $@ do [ "$COUNER_2" -gt "$COUNER_1" ] && ./make_link.sh $CLIENT_NUMBER_1 $CLIENT_NUMBER_2 COUNER_2=$(( $COUNER_2 + 1 )) done COUNER_1=$(( $COUNER_1 + 1 )) done
В качестве параметров командной строки этому скрипту передается любое (не менее двух) количество идентификаторов клиентов, для которых необходимо в дальнейшем обеспечить взаимную шифросвязь через наш сервер.
© Extra Systems, 2024 |