soatok / dhole-cryptography
适合毛茸茸项目的无聊(无聊)加密(由一只狗獾创建)
v1.2.0
2022-11-08 08:42 UTC
Requires
- php: >= 7.2
- ext-json: *
- ext-sodium: *
- paragonie/constant_time_encoding: ^2
- paragonie/hidden-string: ^1|^2
- paragonie/sodium_compat: ^1.19
Requires (Dev)
- phpunit/phpunit: ^8|^9
- vimeo/psalm: ^4
README
PHP libsodium 包装器,用于 Soatok 的 PHP 项目。在非常宽松的 ISC 许可下发布。
需要 PHP 7.2.
其他编程语言中的 Dhole 加密
安装
composer require soatok/dhole-cryptography
用法
密钥生成
您可以通过调用静态 generate()
方法生成随机密钥。这在 AsymmetricPublicKey
对象上是不允许的。
<?php use Soatok\DholeCrypto\Key\AsymmetricSecretKey; use Soatok\DholeCrypto\Key\SymmetricKey; $secret = AsymmetricSecretKey::generate(); $symmetric = SymmetricKey::generate();
您还可以通过将包含密钥材料的 HiddenString
实例传递给构造函数来实例化密钥对象。
非对称加密
数字签名
<?php use Soatok\DholeCrypto\Asymmetric; use Soatok\DholeCrypto\Key\AsymmetricSecretKey; $secret = AsymmetricSecretKey::generate(); $public = $secret->getPublicKey(); $message = "I certify that you have paid your $350 awoo fine"; $sig = Asymmetric::sign($message, $secret); if (!Asymmetric::verify($message, $public, $sig)) { die('AWOO FINE UNPAID'); }
认证公钥加密
注意:您只能使用此 API 解密消息。它底层结合了 sodium_crypto_sign_detached()
和 sodium_crypto_box_seal()
。
<?php use Soatok\DholeCrypto\Asymmetric; use Soatok\DholeCrypto\Key\AsymmetricSecretKey; use ParagonIE\HiddenString\HiddenString; $aSecret = AsymmetricSecretKey::generate(); $aPublic = $aSecret->getPublicKey(); $bSecret = AsymmetricSecretKey::generate(); $bPublic = $bSecret->getPublicKey(); // Encryption $message = new HiddenString( "This is a secret message for your ears only: UwU" ); $encrypt = Asymmetric::encrypt($message, $bPublic, $aSecret); $decrypt = Asymmetric::decrypt($encrypt, $bSecret, $aPublic);
匿名公钥加密
这比认证 API 快(因为它不验证发送者的 Ed25519 签名),但任何人都可以将消息加密到您的公钥。
<?php use Soatok\DholeCrypto\Asymmetric; use Soatok\DholeCrypto\Key\AsymmetricSecretKey; use ParagonIE\HiddenString\HiddenString; $secret = AsymmetricSecretKey::generate(); $public = $secret->getPublicKey(); // Encryption $message = new HiddenString( "This is a secret message for your ears only: UwU" ); $sealed = Asymmetric::seal($message, $public); // Decryption $unseal = Asymmetric::unseal($sealed, $secret);
对称密钥加密
加密
<?php use ParagonIE\HiddenString\HiddenString; use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Symmetric; $key = SymmetricKey::generate(); $message = new HiddenString('This is a secret, okay?'); $encrypted = Symmetric::encrypt($message, $key); $decrypted = Symmetric::decrypt($encrypted, $key);
带有附加数据的加密
<?php use ParagonIE\HiddenString\HiddenString; use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Symmetric; $key = SymmetricKey::generate(); $message = new HiddenString('This is a secret, okay?'); $publicData = "OwO? UwU"; $encrypted = Symmetric::encryptWithAd($message, $key, $publicData); $decrypted = Symmetric::decryptWithAd($encrypted, $key, $publicData);
未加密消息认证
<?php use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Symmetric; $key = SymmetricKey::generate(); $msg = "This is a string"; $auth = Symmetric::auth($msg, $key); if (!Symmetric::verify($msg, $key, $auth)) { die("access denied"); }
密码存储
<?php use ParagonIE\HiddenString\HiddenString; use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Password; $key = SymmetricKey::generate(); $pwHandler = new Password($key); $password = new HiddenString('cowwect howse battewy staple UwU'); $pwhash = $pwHandler->hash($password); if (!$pwHandler->verify($password, $pwhash)) { die("access denied"); }
密钥环
您可以使用 Keyring
类将任何密钥序列化。
<?php use Soatok\DholeCrypto\Key\AsymmetricSecretKey; use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Keyring; // Generate some keys... $secretKey = AsymmetricSecretKey::generate(); $publicKey = $secretKey->getPublicKey(); $symKey = SymmetricKey::generate(); // Load a serializer. $keyring = new Keyring(); // Serialize them as strings... $sk = $keyring->save($secretKey); $pk = $keyring->save($publicKey); $key = $keyring->save($symKey); // Load them from a string... $loadSk = $keyring->load($sk); $loadPk = $keyring->load($pk); $loadKey = $keyring->load($key);
Keyring
类还支持密钥包装。只需将一个单独的 SymmetricKey
实例传递给构造函数即可获取包装密钥。
<?php use Soatok\DholeCrypto\Key\AsymmetricSecretKey; use Soatok\DholeCrypto\Key\SymmetricKey; use Soatok\DholeCrypto\Keyring; // Keywrap key... $wrap = SymmetricKey::generate(); // Generate some keys... $secretKey = AsymmetricSecretKey::generate(); $publicKey = $secretKey->getPublicKey(); $symKey = SymmetricKey::generate(); // Load a serializer. $keyring = new Keyring($wrap); // Serialize them as strings... $sk = $keyring->save($secretKey); $pk = $keyring->save($publicKey); $key = $keyring->save($symKey); // Load them from a string... $loadSk = $keyring->load($sk); $loadPk = $keyring->load($pk); $loadKey = $keyring->load($key);
支持
如果您在使用此库时遇到任何问题,或者某些东西损坏了,请随时提交 Github 问题。
如果您需要帮助进行集成,Soatok 可用于自由职业工作。