将ASCII加密狗转换为十六进制

祝大家有美好的一天。

历史上曾经发生过,我们小规模组织的电子文档管理程序SBIS的组织的电子密钥被导入到每个工作站,每个用户的Windows注册表中。
创建新工作场所时,从Crypto-Pro分支中卸载了带钥匙的灌木丛,并将其导入新用户。
在终端服务器上,我意识到这是不可接受的,因此决定将所有密钥上传到USB闪存驱动器,并允许在Crypto-Pro中使用外部驱动器。

现在,在终端服务器上创建新用户时,无需使用电子键进行手势。

问题是您需要将ASCII密钥从注册表转换为16个二进制文件。
也许我不知道如何“谷歌”,但是我没有找到关于该主题的现成解决方案,因此我在bash上编写了自己的脚本。
也许有人会派上用场。

一个简短的描述。
密钥在注册表分支中-[HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Crypto Pro \ Settings \ Users \ SID-user \ Keys \ Key-name]

卸载的注册表分支中的密钥结构:
“ name.key” =十六进制:10,d5 ...
“ header.key“ =十六进制:20,42,19,...
” primary.key“ =十六进制:
30,12” masks.key“ =十六进制:30,23
” primary2.key“ =十六进制: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

Source: https://habr.com/ru/post/zh-CN382285/


All Articles