Хэш-функции и криптографические функции
В данном разделе при описании функций приняты следующие обозначения:
|
Функции хэширования и контрольных сумм
crc
Вычисляет CRC (контрольную сумму) значения. Используемый алгоритм вычисления задается опционально.
Спецификация функции
crc(value: <строка>, [algorithm: <строка>]) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, для которой вычисляется контрольная сумма. |
да |
|
|
строка |
Алгоритм CRC. Допустимые значения см. ниже. |
|
нет |
Допустимые алгоритмы CRC:
-
"CRC_3_GSM"
; -
"CRC_3_ROHC"
; -
"CRC_4_G_704"
; -
"CRC_4_INTERLAKEN"
; -
"CRC_5_EPC_C1G2"
; -
"CRC_5_G_704"
; -
"CRC_5_USB"
; -
"CRC_6_CDMA2000_A"
; -
"CRC_6_CDMA2000_B"
; -
"CRC_6_DARC"
; -
"CRC_6_GSM"
; -
"CRC_6_G_704"
; -
"CRC_7_MMC"
; -
"CRC_7_ROHC"
; -
"CRC_7_UMTS"
; -
"CRC_8_AUTOSAR"
; -
"CRC_8_BLUETOOTH"
; -
"CRC_8_CDMA2000"
; -
"CRC_8_DARC"
; -
"CRC_8_DVB_S2"
; -
"CRC_8_GSM_A"
; -
"CRC_8_GSM_B"
; -
"CRC_8_HITAG"
; -
"CRC_8_I_432_1"
; -
"CRC_8_I_CODE"
; -
"CRC_8_LTE"
; -
"CRC_8_MAXIM_DOW"
; -
"CRC_8_MIFARE_MAD"
; -
"CRC_8_NRSC_5"
; -
"CRC_8_OPENSAFETY"
; -
"CRC_8_ROHC"
; -
"CRC_8_SAE_J1850"
; -
"CRC_8_SMBUS"
; -
"CRC_8_TECH_3250"
; -
"CRC_8_WCDMA"
; -
"CRC_10_ATM"
; -
"CRC_10_CDMA2000"
; -
"CRC_10_GSM"
; -
"CRC_11_FLEXRAY"
; -
"CRC_11_UMTS"
; -
"CRC_12_CDMA2000"
; -
"CRC_12_DECT"
; -
"CRC_12_GSM"
; -
"CRC_12_UMTS"
; -
"CRC_13_BBC"
; -
"CRC_14_DARC"
; -
"CRC_14_GSM"
; -
"CRC_15_CAN"
; -
"CRC_15_MPT1327"
; -
"CRC_16_ARC"
; -
"CRC_16_CDMA2000"
; -
"CRC_16_CMS"
; -
"CRC_16_DDS_110"
; -
"CRC_16_DECT_R"
; -
"CRC_16_DECT_X"
; -
"CRC_16_DNP"
; -
"CRC_16_EN_13757"
; -
"CRC_16_GENIBUS"
; -
"CRC_16_GSM"
; -
"CRC_16_IBM_3740"
; -
"CRC_16_IBM_SDLC"
; -
"CRC_16_ISO_IEC_14443_3_A"
; -
"CRC_16_KERMIT"
; -
"CRC_16_LJ1200"
; -
"CRC_16_M17"
; -
"CRC_16_MAXIM_DOW"
; -
"CRC_16_MCRF4XX"
; -
"CRC_16_MODBUS"
; -
"CRC_16_NRSC_5"
; -
"CRC_16_OPENSAFETY_A"
; -
"CRC_16_OPENSAFETY_B"
; -
"CRC_16_PROFIBUS"
; -
"CRC_16_RIELLO"
; -
"CRC_16_SPI_FUJITSU"
; -
"CRC_16_T10_DIF"
; -
"CRC_16_TELEDISK"
; -
"CRC_16_TMS37157"
; -
"CRC_16_UMTS"
; -
"CRC_16_USB"
; -
"CRC_16_XMODEM"
; -
"CRC_17_CAN_FD"
; -
"CRC_21_CAN_FD"
; -
"CRC_24_BLE"
; -
"CRC_24_FLEXRAY_A"
; -
"CRC_24_FLEXRAY_B"
; -
"CRC_24_INTERLAKEN"
; -
"CRC_24_LTE_A"
; -
"CRC_24_LTE_B"
; -
"CRC_24_OPENPGP"
; -
"CRC_24_OS_9"
; -
"CRC_30_CDMA"
; -
"CRC_31_PHILIPS"
; -
"CRC_32_AIXM"
; -
"CRC_32_AUTOSAR"
; -
"CRC_32_BASE91_D"
; -
"CRC_32_BZIP2"
; -
"CRC_32_CD_ROM_EDC"
; -
"CRC_32_CKSUM"
; -
"CRC_32_ISCSI"
; -
"CRC_32_ISO_HDLC"
; -
"CRC_32_JAMCRC"
; -
"CRC_32_MEF"
; -
"CRC_32_MPEG_2"
; -
"CRC_32_XFER"
; -
"CRC_40_GSM"
; -
"CRC_64_ECMA_182"
; -
"CRC_64_GO_ISO"
; -
"CRC_64_MS"
; -
"CRC_64_REDIS"
; -
"CRC_64_WE"
; -
"CRC_64_XZ"
; -
"CRC_82_DARC"
;
Ошибки
Функция может возвращать ошибки, для которых требуется обработка:
-
value
не является строкой. -
algorithm
не является поддерживаемым алгоритмом.
Примеры
Вычислить контрольную сумму CRC согласно алгоритму по умолчанию
crc("foo")
"2356372769"
Вычислить контрольную сумму CRC согласно алгоритму CRC_32_CKSUM
crc("foo", algorithm: "CRC_32_CKSUM")
"4271552933"
hmac
Вычисляет HMAC для значения value
с использованием указанного ключа key
. Используемый алгоритм хэширования можно указать опционально.
В большинстве случаев полученный байтовый поток следует закодировать в шестнадцатеричную строку, используя функцию encode_base16
, или в строку в формате Base64, используя функцию encode_base64
.
Спецификация функции
hmac(value: <строка>, key: <строка>, [algorithm: <строка>]) :: <строка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для вычисления HMAC. |
да |
|
|
строка |
Строка для использования в качестве криптографического ключа. |
да |
|
|
строка |
Алгоритм хэширования. Допустимые значения:
|
|
нет |
Ошибки
Эта функция не возвращает ошибок, если в аргументе algorithm
указано значение по умолчанию или строковый литерал с названием алгоритма, распознаваемым и допустимым на этапе компиляции. В противном случае функция будет возвращать ошибки.
Примеры
Вычислить HMAC сообщения (по умолчанию: SHA-256) и закодировать его в строку Base64
encode_base64(hmac("Hello there", "super-secret-key"))
eLGE8YMviv85NPXgISRUZxstBNSU47JQdcXkUWcClmI=
Вычислить HMAC сообщения с использованием SHA-224 и закодировать его в шестнадцатеричную строку
encode_base16(hmac("Hello there", "super-secret-key", algorithm: "SHA-224"))
42fccbc2b7d22a143b92f265a8046187558a94d11ddbb30622207e90
Вычислить HMAC сообщения с использованием переменного алгоритма хэширования
.hash_algo = "SHA-256" hmac_bytes, err = hmac("Hello there", "super-secret-key", algorithm: .hash_algo) if err == null { .hmac = encode_base16(hmac_bytes) }
78b184f1832f8aff3934f5e0212454671b2d04d494e3b25075c5e45167029662
md5
Вычисляет хэш md5 для value
.
Спецификация функции
md5(value: <строка>) :: <строка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для вычисления хэша. |
да |
Примеры
Создание хэша md5
md5("foo")
acbd18db4cc2f85cedef654fccc4a4d8
seahash
Вычисляет хэш Seahash для value
.
Спецификация функции
seahash(value: <строка>) :: <целое число>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
Примечания
Эта функция имеет особое поведение, о котором следует знать:
-
Из-за ограничений в типах данных VRL функция преобразует результат Seahash из беззнакового 64-битного целого числа в знаковый формат. Значения, превышающие максимальное значение знакового 64-битного целого числа, становятся отрицательными.
Примеры
Вычисление хэша Seahash
seahash("foobar")
5348458858952426000
Вычисление отрицательного хэша Seahash
seahash("bar")
-2796170501982571500
sha1
Вычисляет хэш SHA-1 для value
.
Спецификация функции
sha1(value: <строка>) :: <строка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
Примеры
Вычисление хэша SHA-1
sha1("foo")
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
sha2
Вычисляет хэш SHA-2 для value
.
Спецификация функции
sha2(value: <строка>, [variant: <строка>]) :: <строка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
|
|
строка |
Вариант алгоритма хэширования:
|
|
нет |
Примеры
Вычисление хэша SHA-2
sha2("foo", variant: "SHA-512/224")
d68f258d37d670cfc1ec1001a0394784233f88f056994f9a7e5e99be
sha3
Вычисляет хэш SHA-3 для value
.
Спецификация функции
sha3(value: <строка>, [variant: <строка>]) :: <строка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, для которой вычисляется хэш. |
да |
|
|
строка |
Вариант алгоритма хэширования:
|
|
нет |
Примеры
Вычисление хэша SHA-3
sha3("foo", variant: "SHA3-224")
f4f6779e153c391bbd29c95e72b0708e39d9166c7cea51d1f10ef58a
Функции шифрования
encrypt
Шифрует строку с использованием симметричного алгоритма шифрования.
Поддерживаемые алгоритмы:
-
AES-256-CFB (ключ = 32 байта, IV = 16 байт)
-
AES-192-CFB (ключ = 24 байта, IV = 16 байт)
-
AES-128-CFB (ключ = 16 байт, IV = 16 байт)
-
AES-256-OFB (ключ = 32 байта, IV = 16 байт)
-
AES-192-OFB (ключ = 24 байта, IV = 16 байт)
-
AES-128-OFB (ключ = 16 байт, IV = 16 байт)
-
AES-128-SIV (ключ = 32 байта, IV = 16 байт)
-
AES-256-SIV (ключ = 64 байта, IV = 16 байт)
-
AES-256-CTR-LE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-LE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-LE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CTR-BE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-BE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-BE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-PKCS7 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-PKCS7 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-PKCS7 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ANSIX923 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ANSIX923 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ANSIX923 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ISO7816 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ISO7816 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ISO7816 (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-ISO10126 (ключ = 32 байта, IV = 16 байт)
-
AES-192-CBC-ISO10126 (ключ = 24 байта, IV = 16 байт)
-
AES-128-CBC-ISO10126 (ключ = 16 байт, IV = 16 байт)
-
CHACHA20-POLY1305 (ключ = 32 байта, IV = 12 байт)
-
XCHACHA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
-
XSALSA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
Спецификация функции
encrypt(plaintext: <строка>, algorithm: <строка>, key: <строка>, iv: <строка>) :: <строка> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка для шифрования. |
да |
|
|
строка |
Алгоритм, используемый для шифрования. |
да |
|
|
строка |
Ключ для шифрования. Он должен представлять собой сырые (не закодированные) байты. Его длина должна соответствовать указанному алгоритму. |
да |
|
|
строка |
Вектор инициализации (IV) для шифрования. Он должен представлять собой сырые (не закодированные) байты IV. Его длина должна соответствовать указанному алгоритму. Для каждого сообщения следует генерировать новый IV. Вы можете использовать |
да |
Ошибки
Функция encrypt
может возвращать ошибки, для которых требуется обработка:
-
Алгоритм
algorithm
не поддерживается. -
Длина
key
не соответствует требуемому размеру ключа для указанного алгоритма. -
Длина
iv
не соответствует требуемому размеру вектора инициализации для указанного алгоритма.
Примеры
Шифрование значения
plaintext = "super secret message" iv = "1234567890123456" # обычно следует вызывать random_bytes(16) key = "16_byte_keyxxxxx" encrypted_message = encrypt!(plaintext, "AES-128-CBC-PKCS7", key, iv: iv) encode_base64(encrypted_message)
GBw8Mu00v0Kc38+/PvsVtGgWuUJ+ZNLgF8Opy8ohIYE=
decrypt
Дешифрует строку с помощью симметричного алгоритма шифрования.
Поддерживаемые алгоритмы:
-
AES-256-CFB (ключ = 32 байта, iv = 16 байт)
-
AES-192-CFB (ключ = 24 байта, iv = 16 байт)
-
AES-128-CFB (ключ = 16 байт, iv = 16 байт)
-
AES-256-OFB (ключ = 32 байта, iv = 16 байт)
-
AES-192-OFB (ключ = 24 байта, iv = 16 байт)
-
AES-128-OFB (ключ = 16 байт, iv = 16 байт)
-
AES-128-SIV (ключ = 32 байта, IV = 16 байт)
-
AES-256-SIV (ключ = 64 байта, IV = 16 байт)
-
AES-256-CTR-LE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-LE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-LE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CTR-BE (ключ = 32 байта, IV = 16 байт)
-
AES-192-CTR-BE (ключ = 24 байта, IV = 16 байт)
-
AES-128-CTR-BE (ключ = 16 байт, IV = 16 байт)
-
AES-256-CBC-PKCS7 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-PKCS7 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-PKCS7 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ANSIX923 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ANSIX923 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ANSIX923 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ISO7816 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ISO7816 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ISO7816 (ключ = 16 байт, iv = 16 байт)
-
AES-256-CBC-ISO10126 (ключ = 32 байта, iv = 16 байт)
-
AES-192-CBC-ISO10126 (ключ = 24 байта, iv = 16 байт)
-
AES-128-CBC-ISO10126 (ключ = 16 байт, iv = 16 байт)
-
CHACHA20-POLY1305 (ключ = 32 байта, IV = 12 байт)
-
XCHACHA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
-
XSALSA20-POLY1305 (ключ = 32 байта, IV = 24 байта)
Спецификация функции
decrypt(ciphertext: <строка>, algorithm: <строка>, key: <строка>, iv: <строка>) :: <строка>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
строка |
Строка, которую необходимо расшифровать. Она должна представлять собой сырые байты (не закодированные). |
да |
|
|
строка |
Алгоритм, который необходимо использовать. |
да |
|
|
строка |
Ключ для расшифровки. Он должен представлять собой сырые (не закодированные) байты. Его длина должна соответствовать указанному алгоритму. |
да |
|
|
строка |
Вектор инициализации (IV) для расшифровки. Он должен представлять собой сырые (не закодированные) байты IV. Его длина должна соответствовать указанному алгоритму. Для каждого сообщения следует генерировать новый IV. Вы можете использовать |
да |
Ошибки
Функция decrypt
может возвращать ошибки, для которых требуется обработка:
-
Алгоритм
algorithm
не поддерживается. -
Длина
key
не соответствует требуемому размеру ключа для указанного алгоритма. -
Длина
iv
не соответствует требуемому размеру IV для указанного алгоритма.
Примеры
Расшифровка значения
ciphertext = decode_base64!("5fLGcu1VHdzsPcGNDio7asLqE1P43QrVfPfmP4i4zOU=") iv = decode_base64!("fVEIRkIiczCRWNxaarsyxA==") key = "16_byte_keyxxxxx" decrypt!(ciphertext, "AES-128-CBC-PKCS7", key, iv: iv)
super_secret_message