PHP code example of lihongjie0209 / sm-php-bc
1. Go to this page and download the library: Download lihongjie0209/sm-php-bc 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/ */
lihongjie0209 / sm-php-bc example snippets
use SmBc\Crypto\Digests\SM3Digest;
$digest = new SM3Digest();
$data = 'Hello, SM3!';
$bytes = unpack('C*', $data);
$digest->update($bytes, 0, count($bytes));
$hash = array_fill(0, $digest->getDigestSize(), 0);
$digest->doFinal($hash, 0);
echo 'SM3 Hash: ' . bin2hex(pack('C*', ...$hash)) . PHP_EOL;
use SmBc\Crypto\Macs\HMac;
use SmBc\Crypto\Digests\SM3Digest;
use SmBc\Crypto\Params\KeyParameter;
$key = 'my-secret-key';
$message = 'Hello, HMAC-SM3!';
$hmac = new HMac(new SM3Digest());
$hmac->init(new KeyParameter($key));
$hmac->updateBytes($message, 0, strlen($message));
$mac = str_repeat("\x00", $hmac->getMacSize());
$hmac->doFinal($mac, 0);
echo 'HMAC: ' . bin2hex($mac) . PHP_EOL;
use SmBc\Crypto\EC\CustomNamedCurves;
use SmBc\Crypto\Generators\ECKeyPairGenerator;
// 获取 SM2 曲线参数
$domainParams = CustomNamedCurves::getByName('sm2p256v1');
// 生成密钥对
$generator = new ECKeyPairGenerator();
$generator->init($domainParams);
$keyPair = $generator->generateKeyPair();
$privateKey = $keyPair->getPrivate();
$publicKey = $keyPair->getPublic();
echo "Private Key: " . gmp_strval($privateKey->getD(), 16) . PHP_EOL;
echo "Public Key X: " . gmp_strval($publicKey->getQ()->getAffineXCoord()->toBigInteger(), 16) . PHP_EOL;
echo "Public Key Y: " . gmp_strval($publicKey->getQ()->getAffineYCoord()->toBigInteger(), 16) . PHP_EOL;
use SmBc\Crypto\Signers\SM2Signer;
use SmBc\Crypto\Params\ParametersWithRandom;
// 生成密钥对(省略)
$keyPair = $generator->generateKeyPair();
// 初始化签名器
$signer = new SM2Signer();
$signer->init(true, new ParametersWithRandom($keyPair->getPrivate()));
// 签名
$message = 'Hello, SM2!';
$messageBytes = unpack('C*', $message);
$signature = $signer->generateSignature($messageBytes);
// 验证签名
$verifier = new SM2Signer();
$verifier->init(false, $keyPair->getPublic());
$isValid = $verifier->verifySignature($messageBytes, $signature);
echo "Signature valid: " . ($isValid ? 'true' : 'false') . PHP_EOL;
use SmBc\Crypto\Engines\SM2Engine;
// 生成密钥对(省略)
$keyPair = $generator->generateKeyPair();
// 加密
$engine = new SM2Engine();
$engine->init(true, new ParametersWithRandom($keyPair->getPublic()));
$plaintext = unpack('C*', 'Secret message');
$ciphertext = $engine->processBlock($plaintext, 0, count($plaintext));
// 解密
$engine->init(false, $keyPair->getPrivate());
$decrypted = $engine->processBlock($ciphertext, 0, count($ciphertext));
echo "Decrypted: " . pack('C*', ...$decrypted) . PHP_EOL;
use SmBc\Crypto\Engines\SM4Engine;
use SmBc\Crypto\Modes\CBCBlockCipher;
use SmBc\Crypto\Paddings\PKCS7Padding;
use SmBc\Crypto\Paddings\PaddedBufferedBlockCipher;
use SmBc\Crypto\Params\KeyParameter;
use SmBc\Crypto\Params\ParametersWithIV;
// 生成密钥和 IV
$key = random_bytes(16);
$iv = random_bytes(16);
// 创建加密器
$engine = new SM4Engine();
$blockCipher = new CBCBlockCipher($engine);
$padding = new PKCS7Padding();
$cipher = new PaddedBufferedBlockCipher($blockCipher, $padding);
// 加密
$keyParam = new KeyParameter(unpack('C*', $key));
$params = new ParametersWithIV($keyParam, unpack('C*', $iv));
$cipher->init(true, $params);
$plaintext = 'Hello, SM4!';
$input = unpack('C*', $plaintext);
$ciphertext = $cipher->doFinal($input);
// 解密
$cipher->init(false, $params);
$decrypted = $cipher->doFinal($ciphertext);
echo "Decrypted: " . pack('C*', ...$decrypted) . PHP_EOL;
use SmBc\Crypto\Agreement\SM2KeyExchange;
use SmBc\Crypto\Params\SM2KeyExchangePrivateParameters;
use SmBc\Crypto\Params\SM2KeyExchangePublicParameters;
// Alice 生成密钥对(静态 + 临时)
$aliceStaticPair = $generator->generateKeyPair();
$aliceEphemeralPair = $generator->generateKeyPair();
// Bob 生成密钥对(静态 + 临时)
$bobStaticPair = $generator->generateKeyPair();
$bobEphemeralPair = $generator->generateKeyPair();
// Alice 计算共享密钥(发起方)
$aliceExchange = new SM2KeyExchange();
$alicePrivParams = new SM2KeyExchangePrivateParameters(
true, // initiator
$aliceStaticPair->getPrivate(),
$aliceEphemeralPair->getPrivate()
);
$aliceExchange->init($alicePrivParams);
$bobPubParams = new SM2KeyExchangePublicParameters(
$bobStaticPair->getPublic(),
$bobEphemeralPair->getPublic()
);
$aliceSharedKey = $aliceExchange->calculateKey(128, $bobPubParams);
// Bob 计算共享密钥(响应方)
$bobExchange = new SM2KeyExchange();
$bobPrivParams = new SM2KeyExchangePrivateParameters(
false, // responder
$bobStaticPair->getPrivate(),
$bobEphemeralPair->getPrivate()
);
$bobExchange->init($bobPrivParams);
$alicePubParams = new SM2KeyExchangePublicParameters(
$aliceStaticPair->getPublic(),
$aliceEphemeralPair->getPublic()
);
$bobSharedKey = $bobExchange->calculateKey(128, $alicePubParams);
// 验证双方密钥一致
$keysMatch = pack('C*', ...$aliceSharedKey) === pack('C*', ...$bobSharedKey);
echo "Keys match: " . ($keysMatch ? 'true' : 'false') . PHP_EOL;
bash
composer bash
# 进入项目目录
cd sm-php-bc
# 安装依赖
composer install
# 运行单个示例
php examples/sm3_demo.php # SM3 哈希
php examples/sm2_demo.php # SM2 完整功能
php examples/sm4_demo.php # SM4 多种模式
php examples/key_exchange_demo.php # SM2 密钥交换
php examples/advanced_demo.php # 高级特性
# 运行所有示例
php examples/demo_all_features.php