Convertir dongles ASCII a hexadecimales

Buen día a todos.

Sucedió históricamente que las claves electrónicas de las organizaciones de nuestra pequeña explotación para el programa de gestión de documentos electrónicos SBIS se importaron en el registro de Windows de cada estación de trabajo, cada usuario.
Al crear un nuevo lugar de trabajo, se descargó un arbusto con claves de la rama Crypto-Pro y se importó a un nuevo usuario.
En un servidor de terminal, me di cuenta de que esto era inaceptable y decidí cargar todas las claves en una unidad flash USB y permitir unidades externas en Crypto-Pro.

Ahora, al crear nuevos usuarios en el servidor de terminal, no se necesitan gestos con claves electrónicas.

El problema era que necesita convertir las claves ASCII del registro a 16 archivos binarios.
Tal vez no sé cómo "googlear", pero no encontré ninguna solución preparada sobre el tema, así que hice mi propio script en bash.
Tal vez alguien sea útil.

Una pequeña descripción
Las claves están en la rama del registro: [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Crypto Pro \ Settings \ Users \ SID-user \ Keys \ Key-name]

Estructura de la clave en la rama del registro descargada:
"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 ...
" máscaras2 .key ”= hex: 30,56,10 ...

Como parámetro, el script debe especificar un archivo con las claves descargadas del registro (por ejemplo, keys.reg).
Como resultado de la secuencia de comandos, la carpeta de claves se creará en el directorio raíz desde el que se inició la secuencia de comandos y dentro de la carpeta con el nombre de las claves. Las carpetas con el nombre de las claves contendrán 6 archivos cada una: nombre.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/es382285/


All Articles