1. Go to this page and download the library: Download erikwang2013/encryption library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
erikwang2013 / encryption example snippets
use Erikwang2013\Encryption\EncryptionManagerFactory;
public function register(): void
{
$this->app->singleton(\Erikwang2013\Encryption\EncryptionManager::class, function () {
$raw = config('app.custom_master_key'); // e.g. base64 for 32 bytes
$master = is_string($raw) ? base64_decode($raw, true) : '';
if ($master === false || strlen($master) !== 32) {
throw new \RuntimeException('Invalid 32-byte master key.');
}
return EncryptionManagerFactory::fromMasterKey($master, 'aes-256-gcm');
});
}
use Erikwang2013\Encryption\EncryptionManagerFactory;
function app_encryption_manager(): \Erikwang2013\Encryption\EncryptionManager
{
static $mgr = null;
if ($mgr === null) {
$master = base64_decode(config('app.master_key'), true);
$mgr = EncryptionManagerFactory::fromMasterKey($master, 'aes-256-gcm');
}
return $mgr;
}
use Erikwang2013\Encryption\EncryptionManager;
use Erikwang2013\Encryption\EncryptionManagerFactory;
return [
EncryptionManager::class => function () {
$master = base64_decode((string) config('encryption.master_key'), true);
return EncryptionManagerFactory::fromMasterKey($master, 'aes-256-gcm');
},
];
// bootstrap.php — ryption\EncryptionManagerFactory;
$raw = getenv('ENCRYPTION_MASTER_KEY'); // base64 of 32 random bytes
$key = is_string($raw) ? base64_decode($raw, true) : false;
if ($key === false || strlen($key) !== 32) {
throw new RuntimeException('ENCRYPTION_MASTER_KEY must be base64 of 32 bytes.');
}
$manager = EncryptionManagerFactory::fromMasterKey($key, 'aes-256-gcm');
// anywhere else in the project
$stored = base64_encode($manager->encrypt($phone)); // store as TEXT
$phone = $manager->decrypt(base64_decode($stored)); // read it back
use Erikwang2013\Encryption\Encryptor\Aes256GcmEncryptor;
use Erikwang2013\Encryption\EncryptionManager;
use Erikwang2013\Encryption\EncryptorRegistry;
$key = random_bytes(32);
$encryptor = new Aes256GcmEncryptor($key);
$ciphertext = $encryptor->encrypt('plaintext');
$plaintext = $encryptor->decrypt($ciphertext);
$registry = new EncryptorRegistry(new Aes256GcmEncryptor($key));
$manager = new EncryptionManager($registry, 'aes-256-gcm');
$blob = $manager->encrypt('data');
use Erikwang2013\Encryption\Asymmetric\Sm2AsymmetricCipher;
use Erikwang2013\Encryption\AsymmetricCipherRegistry;
use Erikwang2013\Encryption\AsymmetricCryptoManager;
use Erikwang2013\Encryption\Guomi\Sm2EncryptionService;
// symmetricCryptoManager(new AsymmetricCipherRegistry($cipher), 'sm2');
$hexCipher2 = $mgr->encrypt('plaintext', $pair->getPublicKey());
use Erikwang2013\Encryption\Hash\Sha256Hasher;
use Erikwang2013\Encryption\Guomi\Sm3Hasher;
use Erikwang2013\Encryption\HasherRegistry;
use Erikwang2013\Encryption\HashingManager;
$registry = new HasherRegistry(
new Sha256Hasher(),
new Sm3Hasher(),
);
$hashing = new HashingManager($registry, 'sha256');
$bin = $hashing->digest('data');
$hex = $hashing->digestHex('data', 'sm3');
use Erikwang2013\Encryption\Kdf\HkdfSha256;
use Erikwang2013\Encryption\Kdf\Pbkdf2Sha256;
use Erikwang2013\Encryption\KeyDerivationManager;
use Erikwang2013\Encryption\KeyDerivationRegistry;
use Erikwang2013\Encryption\PasswordBasedKdfManager;
use Erikwang2013\Encryption\PasswordBasedKdfRegistry;
// Derive subkey from high-entropy material (e.g. TLS, envelope subkeys)
$hkdf = new HkdfSha256();
$subKey = $hkdf->derive($ikm32, $salt, 32, 'app:v1');
$kdfMgr = new KeyDerivationManager(new KeyDerivationRegistry($hkdf), 'hkdf-sha256');
// Derive from user password (for password storage prefer password_hash / Argon2, etc.)
$pbkdf2 = new Pbkdf2Sha256(iterations: 310_000);
$derived = $pbkdf2->deriveFromPassword('user password', random_bytes(16), 32);
$pwdMgr = new PasswordBasedKdfManager(new PasswordBasedKdfRegistry($pbkdf2), 'pbkdf2-sha256');
use Erikwang2013\Encryption\Guomi\Sm2EncryptionService;
use Erikwang2013\Encryption\Guomi\Sm3Hasher;
use Erikwang2013\Encryption\Guomi\Sm4CbcEncryptor;
use Erikwang2013\Encryption\Guomi\ZucEncryptor;
$sm3 = new Sm3Hasher();
$bin = $sm3->digest('data');
$key16 = random_bytes(16);
$sm4 = new Sm4CbcEncryptor($key16);
$blob = $sm4->encrypt('plaintext');
$zuc = new ZucEncryptor($key16);
$blob2 = $zuc->encrypt('plaintext');
// SM2: see asymmetric example above or Sm2EncryptionService
$v1 = EncryptionManagerFactory::fromMasterKey($master); // read legacy data
$v2 = EncryptionManagerFactory::fromMasterKey($master, 'aes-256-gcm', 'v2'); // write new data
$plain = $v1->decrypt($legacyBlob, 'aes-256-cbc-hmac'); // 1. decrypt with v1
$blob = $v2->encrypt($plain, 'aes-256-cbc-hmac'); // 2. re-encrypt with v2
bash
# generate the key once, keep it in the server environment — never in the code
export ENCRYPTION_MASTER_KEY="$(php -r 'echo base64_encode(random_bytes(32)), PHP_EOL;')"
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.