Converter dongles ASCII em hexadecimal

Bom Dia a todos.

Aconteceu historicamente que as chaves eletrônicas das organizações de nossa pequena holding para o programa de gerenciamento eletrônico de documentos SBIS foram importadas para o registro do Windows de cada estação de trabalho, de cada usuário.
Ao criar um novo local de trabalho, um arbusto com chaves foi descarregado da ramificação Crypto-Pro e importado para um novo usuário.
Em um servidor de terminal, percebi que isso era inaceitável e decidi fazer o upload de todas as chaves para uma unidade flash USB e permitir unidades externas no Crypto-Pro.

Agora, ao criar novos usuários no servidor de terminal, não são necessários gestos com chaves eletrônicas.

O problema era que você precisava converter chaves ASCII do registro em 16 arquivos binários.
Talvez eu não saiba como "pesquisar" no Google, mas não encontrei soluções prontas sobre o assunto, então criei meu próprio script no bash.
Talvez alguém venha a calhar.

Uma pequena descrição.
As chaves estão na ramificação do registro - [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Crypto Pro \ Settings \ Users \ SID-user \ Keys \ Key-name]

Estrutura da chave na ramificação do registro descarregada:
"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 ...

Como parâmetro, o script deve especificar um arquivo com as chaves baixadas do registro (por exemplo, keys.reg).
Como resultado do script, a pasta de chaves será criada no diretório raiz a partir do qual o script foi iniciado e dentro dela a pasta com o nome das chaves. As pastas com o nome das chaves conterão 6 arquivos cada - 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

Source: https://habr.com/ru/post/pt382285/


All Articles