Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.07.2018(UTC) Сообщений: 467
Сказал(а) «Спасибо»: 43 раз Поблагодарили: 69 раз в 61 постах
|
Для этого нужно либо покупать и использовать КриптоПро .Net (примеры там же есть), или же пользоваться низкоуровневыми функциями MS CryptoAPI. Ветка КриптоПро .Net тут. Для генерации ключа путем вызова низкоуровневых функций потребуется AlgID. Ниже powershell скрипт, который выводит их для провайдера с ProvType 80 (Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider): Код:$lib = @"
[DllImport("/opt/cprocsp/lib/amd64/libcapi20.so.4.0.5", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContextA(
ref IntPtr phProv,
string pszContainer,
string pszProvider,
uint dwProvType,
Int64 dwFlags
);
[DllImport("/opt/cprocsp/lib/amd64/libcapi20.so.4.0.5", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptGetProvParam(
IntPtr hProv,
uint dwParam,
byte[] pbProvData,
ref uint pdwProvDataLen,
uint dwFlags
);
[DllImport("/opt/cprocsp/lib/amd64/libcapi20.so.4.0.5", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptGenKey(
IntPtr phProv,
int Algid,
int dwFlags,
ref IntPtr phKey
);
[DllImport("/opt/cprocsp/lib/amd64/libcapi20.so.4.0.5", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptDestroyKey(
IntPtr hKey
);
[DllImport("/opt/cprocsp/lib/amd64/libcapi20.so.4.0.5", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptReleaseContext(
IntPtr phProv,
int flags
);
"@
Add-Type -MemberDefinition $lib -Namespace PKI -Name CSP
[IntPtr] $phProv = [IntPtr]::Zero
[PKI.CSP]::CryptAcquireContextA(
[ref]$phProv,
$null,
"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
80,
(0xf0000000)
) | Out-Null
[byte[]]$pbProvData = $null
[int]$pbProvDataLen = 0
$flag = [PKI.CSP]::CryptGetProvParam($phProv, 0x16, $pbProvData, [ref]$pbProvDataLen, 0x1)
$algs = [System.Collections.ArrayList]::new()
while ($flag) {
$algInfo = "" | Select-Object AlgName, DefaultLength, MinLength, MaxLength, Protocols, LongName, AlgID
#Получаю байтики
$pbProvData = [byte[]]::new($pbProvDataLen)
$flag = [PKI.CSP]::CryptGetProvParam($phProv, 0x16, $pbProvData, [ref]$pbProvDataLen, 0x2)
if ($flag -eq $false) {
break;
}
# Начинаю парсить вывод согласно https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/ns-wincrypt-prov_enumalgs_ex
$NameLength = [System.BitConverter]::ToInt32($pbProvData[20..23],0)
$algInfo.AlgName = [System.Text.Encoding]::ASCII.GetString($pbProvData[24..(24 + ($NameLength - 2))])
$LongNameLength = [System.BitConverter]::ToInt32($pbProvData[44..47],0)
$algInfo.LongName = [System.Text.Encoding]::ASCII.GetString($pbProvData[48..(48 + ($LongNameLength - 2))])
$algInfo.DefaultLength = [System.BitConverter]::ToInt32($pbProvData[4..7],0)
$algInfo.MinLength = [System.BitConverter]::ToInt32($pbProvData[8..11],0)
$algInfo.MaxLength = [System.BitConverter]::ToInt32($pbProvData[12..15],0)
$algInfo.Protocols = $pbProvData[16..19]
$algInfo.AlgID = [System.BitConverter]::ToInt32($pbProvData[0..3],0)
[void]$algs.Add($algInfo)
}
$algs | Format-Table | Out-Host
[PKI.CSP]::CryptReleaseContext($phProv, 0) | Out-Null
Пример вывода: Код:AlgName DefaultLength MinLength MaxLength Protocols LongName AlgID
------- ------------- --------- --------- --------- -------- -----
GR 34.11-2012 256 256 256 256 {0, 0, 0, 0} GOST R 34.11-2012 256 32801
GR 34.10-2012 256 512 512 512 {0, 0, 0, 0} GOST R 34.10-2012 256 11849
DH 34.10-2012 256 512 512 512 {0, 0, 0, 0} GOST R 34.10-2012 256 DH 43590
DH 34.10-2012 256 512 512 512 {0, 0, 0, 0} GOST R 34.10-2012 256 DH 43591
GOST 28147-89 MAC 32 8 32 {0, 0, 0, 0} GOST 28147-89 MAC 32799
GR 34.12-15 M 256 256 256 {0, 0, 0, 0} GOST R 34.12-2015 64 Magma 26160
GR 34.12-15 K 256 256 256 {0, 0, 0, 0} GOST R 34.12-2015 128 Kuznyechik 26161
GR 34.13-15 M MAC 64 8 64 {0, 0, 0, 0} GOST R 34.13-2015 64 Magma MAC 32828
GR 34.13-15 K MAC 128 8 128 {0, 0, 0, 0} GOST R 34.13-2015 128 Kuznyechik MAC 32829
GR34.11-12 256 HMAC 256 256 256 {0, 0, 0, 0} GOST R 34.11-2012 256 HMAC 32820
Отредактировано пользователем 8 марта 2023 г. 21:31:23(UTC)
| Причина: Не указана |
 1 пользователь поблагодарил TolikTipaTut1 за этот пост.
|
|