Fehlende ALTCHA-Bibliotheksdateien ergaenzt
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace AltchaOrg\Altcha\V1;
|
||||||
|
|
||||||
|
use AltchaOrg\Altcha\V1\Hasher\Algorithm;
|
||||||
|
use AltchaOrg\Altcha\V1\Hasher\Hasher;
|
||||||
|
use AltchaOrg\Altcha\V1\Hasher\HasherInterface;
|
||||||
|
|
||||||
|
class Obfuscator
|
||||||
|
{
|
||||||
|
public const DEFAULT_MAX_NUMBER = 10_000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $maxNumber Maximum number for the random number generator (default: 10,000)
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
private readonly int $maxNumber = self::DEFAULT_MAX_NUMBER,
|
||||||
|
private readonly HasherInterface $hasher = new Hasher(),
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypts a payload for PoW-based reveal using AES-GCM.
|
||||||
|
*
|
||||||
|
* @param string $raw Plaintext payload to encrypt.
|
||||||
|
* @param string $key Symmetric key used to encrypt/decrypt the payload. Defaults to empty string, ie. no key.
|
||||||
|
* @param null|int $counter Optional fixed PoW counter used to derive the IV. If null, a random integer in [0, $this->maxNumber] inclusive is chosen.
|
||||||
|
*
|
||||||
|
* @return string Base64-encoded bytes of ciphertext followed by the 16‑byte GCM authentication tag ($ciphertext . $tag).
|
||||||
|
*/
|
||||||
|
public function obfuscateData(string $raw, string $key = '', ?int $counter = null): string
|
||||||
|
{
|
||||||
|
$cipher = 'AES-256-GCM';
|
||||||
|
$keyHash = $this->hasher->hash(Algorithm::SHA256, $key);
|
||||||
|
|
||||||
|
$ivLength = openssl_cipher_iv_length($cipher);
|
||||||
|
|
||||||
|
if (false === $ivLength) {
|
||||||
|
throw new \RuntimeException('Getting cipher iv length failed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$iv = ''; // AES‑GCM initialization vector (IV), typically 12 bytes for AES-256-GCM
|
||||||
|
$num = $counter ?? $this->randomInt();
|
||||||
|
|
||||||
|
// Fill IV from the counter, one byte at a time (little‑endian)
|
||||||
|
for ($i = 0; $i < $ivLength; $i++) {
|
||||||
|
$iv .= \chr(abs($num % 256));
|
||||||
|
$num = intdiv($num, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
$encryptedData = openssl_encrypt($raw, $cipher, $keyHash, \OPENSSL_RAW_DATA, $iv, $tag);
|
||||||
|
|
||||||
|
if (!$encryptedData) {
|
||||||
|
throw new \RuntimeException('Data encryption failed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return base64_encode($encryptedData . $tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function randomInt(): int
|
||||||
|
{
|
||||||
|
return random_int(0, $this->maxNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user