RIPEMD-160: подключение и использование

RIPEMD-160 в SJCL реализован как часть набора криптографических хеш-функций и доступен через пространство имён sjcl.hash. Он используется реже, чем SHA-256, но остаётся важным в системах, где требуется компактный 160-битный хеш с исторической совместимостью (например, криптовалютные протоколы).


RIPEMD-160 становится доступным после подключения основной библиотеки Stanford JavaScript Crypto Library:

<script src="sjcl.js"></script>

В модульной среде (Node.js или bundler) возможен импорт:

import sjcl from "sjcl";

или

const sjcl = require("sjcl");

Важно учитывать, что не все сборки SJCL содержат полный набор хеш-функций. В минимизированных версиях некоторые алгоритмы могут быть исключены.


Доступ к RIPEMD-160

Хеш-функция реализована в пространстве имён:

sjcl.hash.ripemd160

Создание экземпляра:

const hash = new sjcl.hash.ripemd160();

После этого объект можно использовать для поэтапного (streaming) хеширования данных.


Базовое хеширование строки

SJCL не работает напрямую со строками в хеш-функциях. Входные данные должны быть преобразованы в bitArray.

Стандартный пример:

const data = "hello world";

// преобразование строки в bitArray
const bits = sjcl.codec.utf8String.toBits(data);

// создание хеша
const hash = new sjcl.hash.ripemd160();
hash.update(bits);

// получение результата
const result = hash.finalize();

Преобразование результата в читаемый формат

Результат RIPEMD-160 — это bitArray, который обычно преобразуется в hex:

const hex = sjcl.codec.hex.fromBits(result);
console.log(hex);

Выход будет 40-символьной шестнадцатеричной строкой (160 бит = 20 байт).


Однострочное хеширование

Для простых задач удобнее использовать финализацию без промежуточных обновлений:

const bits = sjcl.codec.utf8String.toBits("hello world");
const hash = sjcl.hash.ripemd160.hash(bits);

const hex = sjcl.codec.hex.fromBits(hash);

Метод hash() создаёт новый экземпляр и возвращает итоговое значение.


Обновление данных по частям

RIPEMD-160 поддерживает потоковую обработку, что важно при работе с большими данными:

const h = new sjcl.hash.ripemd160();

h.update(sjcl.codec.utf8String.toBits("hello "));
h.update(sjcl.codec.utf8String.toBits("world"));

const digest = h.finalize();
console.log(sjcl.codec.hex.fromBits(digest));

Это поведение аналогично SHA-1/SHA-256 в SJCL.


Работа с бинарными данными

RIPEMD-160 часто используется не только для текста, но и для бинарных буферов.

Если данные уже представлены в bitArray, преобразование не требуется:

const bits = [0x12345678, 0x9abcdef0]; // пример bitArray

const hash = sjcl.hash.ripemd160.hash(bits);

Кодирование и совместимость с внешними системами

SJCL использует собственный формат bitArray, поэтому при взаимодействии с WebCrypto, Node.js Buffer или криптобиблиотеками требуется конвертация:

Node.js Buffer → SJCL:

const buffer = Buffer.from("data");
const bits = sjcl.codec.hex.toBits(buffer.toString("hex"));

SJCL → Buffer:

const hex = sjcl.codec.hex.fromBits(digest);
const buffer = Buffer.from(hex, "hex");

Типовой сценарий: двойное хеширование

RIPEMD-160 часто применяется в комбинации с SHA-256:

const data = sjcl.codec.utf8String.toBits("message");

// SHA-256
const sha256 = sjcl.hash.sha256.hash(data);

// RIPEMD-160 от результата SHA-256
const ripemd = sjcl.hash.ripemd160.hash(sha256);

console.log(sjcl.codec.hex.fromBits(ripemd));

Такая схема используется для уменьшения размера итогового хеша при сохранении криптографической стойкости.


Применение в криптовалютах

RIPEMD-160 является ключевым элементом в формировании адресов Bitcoin:

  1. SHA-256 от публичного ключа
  2. RIPEMD-160 от результата SHA-256
  3. добавление служебных байтов и контрольной суммы

В SJCL это выглядит как цепочка преобразований:

const pubKeyBits = sjcl.codec.hex.toBits(pubKeyHex);

const sha = sjcl.hash.sha256.hash(pubKeyBits);
const ripe = sjcl.hash.ripemd160.hash(sha);

const addressHash = sjcl.codec.hex.fromBits(ripe);

Особенности реализации в SJCL

RIPEMD-160 в SJCL реализован на чистом JavaScript и опирается на:

  • операции над 32-битными словами
  • внутренний формат bitArray
  • отсутствие нативных ускорений (в отличие от WebCrypto)

Из-за этого производительность ниже, чем у SHA-256 в браузерных API, но выше совместимость и контроль над процессом обработки данных.


Производительность и ограничения

RIPEMD-160 в SJCL имеет следующие особенности:

  • медленнее встроенного crypto.subtle.digest
  • стабилен для небольших и средних объёмов данных
  • не предназначен для высоконагруженных потоковых систем
  • оптимален для совместимости с legacy-протоколами

Типичные ошибки при использовании

Неправильная передача строки напрямую:

sjcl.hash.ripemd160.hash("text"); // некорректно

Правильный вариант:

sjcl.hash.ripemd160.hash(sjcl.codec.utf8String.toBits("text"));

Использование неподходящего кодирования приводит к различиям в хешах между системами. Чаще всего проблема возникает при смешивании UTF-8 и ASCII без явного преобразования через sjcl.codec.utf8String.