_Crypt_EncryptData() и _Crypt_DecryptData() путаница

У меня проблемы с _Crypt_EncryptData(), Я хочу зашифровать данные, сохранить их, а затем прочитать их расшифрованные.

Похоже на то _Crypt_EncryptData() а также _Crypt_DecryptData() не симметричны; первый делает неявное шестнадцатеричное кодирование выходного значения. Но последний выполняет неявное двоичное преобразование на входе (пока все хорошо), но затем выполняет неявное шестнадцатеричное преобразование на своем выходе! Следовательно, в одном файле:

$ciphertext=_Crypt_EncryptData($cleartext, $g_hKey, $CALG_3DES)
$cleartext=_HexToString(_Crypt_DecryptData($ciphertext, $g_hKey, $CALG_3DES))

(erk!) вернет мне исходный открытый текст. Мне не удалось восстановить открытый текст из файла при всех вызовах. Зашифрованный текст менялся каждый раз, например, со строкой "Это тест", при последующих выполнениях, которые я получал:

 0x0B656F9BCC35B73A6EA9D08701E78713
 0xEBE1E744668C379CE74480C3A56303A2
 0x25F50D6B833B3CEF60FCFAF8AE673CF3

Я ожидал бы этого, если бы из-за различных векторов инициализации, однако, глядя на "Crypt.au3", я не вижу способа установить или получить IV (я знаю, что DES3 небезопасен - это другая битва). Это я или это AutoIt?

Вот полный источник скрипта для воспроизведения проблемы:

#include <StringConstants.au3>
#include <Crypt.au3>
#include <String.au3>

_Crypt_Startup() 
$inifile="C:\test_au_enc.ini"
$g_hKey = _Crypt_DeriveKey("s3cr3t.S4uce", $CALG_3DES)

; test previous invocation
$readback=IniRead($inifile, "main", "pass", "Failed")
if ("Failed"=$readback) Then
   MsgBox(0, "Enc Dec", "Failed to read ini file")
Else
   $dec=_HexToString(_Crypt_DecryptData($readback, $g_hKey, $CALG_3DES))
   MsgBox(0,"Enc Dec", "Read from previous: " & $dec)
   ; this fails to recover the cleartext
EndIf


$subj=InputBox("Enc Dec", "Please supply a string to encrypt", "This is a test");

; encrypt the string and write it to a file...
$enc=_Crypt_EncryptData($subj, $g_hKey, $CALG_3DES)
IniWrite($inifile, "main", "pass", $enc)

; now read back the value and decrypt
$readback=IniRead($inifile, "main", "pass", "Failed")
$dec=_HexToString(_Crypt_DecryptData($readback, $g_hKey, $CALG_3DES))
InputBox("Enc Dec", "Encrypted:" & $enc & @CRLF & "decrypted:" & $dec, $enc)
; here the decrypted text matches the cleartext 

1 ответ

Решение

В соответствии с файлом справки; использование _Crypt_DeriveKey() правильно, но вы должны позвонить _Crypt_EncryptData() а также _Crypt_DecryptData() вот так при использовании собственного производного ключа:

$enc = _Crypt_EncryptData($subj, $g_hKey, $CALG_USERKEY)
$dec = _HexToString(_Crypt_DecryptData($readback, $g_hKey, $CALG_USERKEY))

Разница в том $CALG_USERKEY для $iAlgID параметр, который говорит лечить $vCryptKey параметр в качестве дескриптора ключа вместо пароля. Кажется, это работает как задумано.

Вот полный код:

#include <StringConstants.au3>
#include <Crypt.au3>
#include <String.au3>

_Crypt_Startup()
$inifile="C:\test_au_enc.ini"
$g_hKey = _Crypt_DeriveKey("s3cr3t.S4uce", $CALG_3DES)

; test previous invocation
$readback=IniRead($inifile, "main", "pass", "Failed")
if ("Failed"=$readback) Then
   MsgBox(0, "Enc Dec", "Failed to read ini file")
Else
   $dec=_HexToString(_Crypt_DecryptData($readback, $g_hKey, $CALG_USERKEY))
   MsgBox(0,"Enc Dec", "Read from previous: " & $dec)
   ; this fails to recover the cleartext
EndIf


$subj=InputBox("Enc Dec", "Please supply a string to encrypt", "This is a test");

; encrypt the string and write it to a file...
$enc=_Crypt_EncryptData($subj, $g_hKey, $CALG_USERKEY)
IniWrite($inifile, "main", "pass", $enc)

; now read back the value and decrypt
$readback=IniRead($inifile, "main", "pass", "Failed")
$dec=_HexToString(_Crypt_DecryptData($readback, $g_hKey, $CALG_USERKEY))
InputBox("Enc Dec", "Encrypted:" & $enc & @CRLF & "decrypted:" & $dec, $enc)
; here the decrypted text matches the cleartext
Другие вопросы по тегам