Pull to refresh

Конвертация электронных ключей ASCII в hex

Reading time 2 min
Views 5.5K
Всем доброго времени суток.

Так уж сложилось исторически, что электронные ключи организаций нашего небольшого холдинга для программы электронного документооборота SBIS были импортированы в реестр windows каждой рабочей станции, каждого пользователя.
При создании нового рабочего места выгружался куст с ключами из ветки Crypto-Pro и импортировался новому пользователю.
На терминальном сервере, понял, что такое недопустимо и решил выгрузить все ключи на флешку и разрешить в Crypto-Pro внешние накопители.

Теперь при создании новых пользователей на терминальном сервере никаких телодвижений с электронными ключами делать не нужно.

Проблема была в том, что нужно конвертировать ASCII ключи из реестра в 16 ричные файлы.
Возможно я плохо умею «гуглить», но готовых решений по теме не нашел, по этому сделал собственный скриптик на bash.
Может, кому то пригодится.

Небольшое описание.
Ключи находятся в ветке реестра — [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Users\SID-пользователя\Keys\Название-ключа]

Структура ключа в выгруженной ветке реестра:
«name.key»=hex:10,d5…
«header.key»=hex:20,42,19,…
«primary.key»=hex:30,12
«masks.key»=hex:30,23
«primary2.key»=hex:30,12…
«masks2.key»=hex:30,56,10…

В качестве параметра скрипту необходимо указать файл с выгруженными ключами из реестра (например keys.reg).
В результате работы скрипта создастся папка keys в корневой директории из которой запускали скрипт и внутри нее папки с названием ключей. Папки с названием ключей будут содержать по 6 файлов — name.key, header.key, primary.key, primary2.key, masks.key, masks2.key.

#!/bin/bash

path=./
temp=$path/temp

file[1]="name.key"
file[2]="masks.key"
file[3]="masks2.key"
file[4]="primary.key"
file[5]="primary2.key"
file[6]="header.key"

if [ ! -d "$temp" ]; then 
    mkdir "$temp"
fi

if [ ! -d "$path/keys" ]; then 
    mkdir "$path/keys"
fi

# CR to LF. Конвертируем файл в формат UNIX (Окончания строк LF, вместо CR)
dos2unix -n -q $1 $temp/$1

# Записываем имена всех ключей во временный файл
cat $temp/$1 | grep -E -o 'Keys\\\w+]' | sed -E 's/Keys\\//; s/]//' > $temp/keysname

while read key
   do
     # Записываем полное содержимое ключа в отдельный файл с его именем
     cat $temp/$1 | sed -e '/./{H;$!d;}' -e "x;/$key]/!d" | sed -n "/$key]/!p" > $temp/$key
	
	# Разделяем ключи (name, primary, masks, header...) и записываем в отдельные файлы в папку с именем ключа 
	if ! [ -d "$path/keys/$key" ]; then
              mkdir "$path/keys/$key"
	fi

	for i in {1..6}; 
   	 do 
   	 hex=$(cat $temp/$key | tr -d '\n' | sed -E 's/\\//g; s/ //g; s/\$//g' | grep -E -o "${file[$i]}\"=hex:(\w{2},?)+?" | sed -E "s/${file[$i]}\"=hex://; s/,//g" | sed -E 's/\w{2}/\\x&/g')
   	 echo -e -n "$hex" > "$path/keys/$key/${file[$i]}"

	 # LF to CR ??? 
	 # sed 's/$'"/`echo \\\r`/" "$path/keys/${file[$i]}" > "$path/keys/${file[$i]}"
	done
done < $temp/keysname

# Очистка временных файлов
if [ -d "$temp" ]; then 
   rm -rf "$temp"
fi

exit 0
Tags:
Hubs:
+6
Comments 9
Comments Comments 9

Articles