rasskar / whatsapp-crypto
WhatsApp media encryption package
1.0.0
2025-02-12 12:01 UTC
Requires
- guzzlehttp/psr7: ^2.7
- paragonie/sodium_compat: ^2.1
Requires (Dev)
- phpunit/phpunit: ^12.0
- squizlabs/php_codesniffer: ^3.11
README
Описание
rasskar/whatsapp-crypto
— это библиотека с декораторами для PSR-7 потоков, которые шифруют и расшифровывают медиафайлы в соответствии с алгоритмом WhatsApp.
Она использует AES-256-CBC, HMAC-SHA256 и HKDF для безопасного шифрования.
Установка через Сomposer
composer require rasskar/whatsapp-crypto
Требования
- PHP 8.0 или выше
- OpenSSL
Информационные строки для HKDF
HKDF позволяет указывать информационные строки, специфичные для контекста/приложения. В данном случае контекстом является тип файла, для каждого из которых своя информационная строка:
Media Type | Application Info |
---|---|
IMAGE | WhatsApp Image Keys |
VIDEO | WhatsApp Video Keys |
AUDIO | WhatsApp Audio Keys |
Шифрование
require 'vendor/autoload.php'; use GuzzleHttp\Psr7\Stream; use Rasskar\Crypto\Facades\MediaCrypto; use Rasskar\Crypto\Services\KeyGenerator; // Исходный файл $filePath = 'input.jpg'; $mediaKey = random_bytes(32); $info = "WhatsApp Image Keys"; // Открываем поток $stream = new Stream(fopen($filePath, 'rb')); // Создаём HKDFKeyGenerator $keyGenerator = new HKDFKeyGenerator(); // Используем фасад MediaCrypto для шифрования $encryptedData = MediaCrypto::encrypt($stream, $keyGenerator, $mediaKey, $info); // Сохраняем зашифрованный файл file_put_contents('output.enc', $encryptedData); echo "Файл зашифрован: output.enc";
Расшифровка
require 'vendor/autoload.php'; use GuzzleHttp\Psr7\Stream; use Rasskar\Crypto\Facades\MediaCrypto; use Rasskar\Crypto\Services\KeyGenerator; // Файл с зашифрованными данными $filePath = 'output.enc'; $mediaKey = "..."; // Должен быть таким же, как при шифровании $info = "WhatsApp Image Keys"; // Открываем поток $encryptedStream = new Stream(fopen($encryptedFile, 'r')); // Создаём HKDFKeyGenerator $keyGenerator = new HKDFKeyGenerator(); // Дешифруем файл используя фасад MediaCrypto $decryptedData = MediaCrypto::decrypt($filePath, $keyGenerator, $mediaKey, $info); // Сохраняем расшифрованный файл file_put_contents('output.jpg', $decryptedData); echo "Файл расшифрован: output.jpg";