首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
PHP 如何实现 SM2/SM3/SM4 国密算法的加解密
# 国密算法介绍 SM2、SM3 和 SM4 是中国国家密码管理局制定的一系列商用密码算法标准,主要用于替代国际上广泛使用的 RSA、SHA、AES 等算法。 ## SM2 算法 SM2 是一种椭圆曲线公钥密码算法,用于数字签名、密钥交换和公钥加密。其主要特点包括: - 基于 256 位椭圆曲线 - 安全性与 RSA-2048 相当 - 计算效率高于 RSA - 支持密钥协商、数字签名和公钥加密功能 ## SM3 算法 SM3 是一种密码散列算法,用于数字签名及验证、消息认证码生成及验证、随机数生成等。其主要特点包括: - 输出长度为 256 位 - 类似于 SHA-256,但采用不同的压缩函数 - 抗碰撞性和抗原像性较强 ## SM4 算法 SM4 是一种分组密码算法,用于数据加密。其主要特点包括: - 分组长度和密钥长度均为 128 位 - 采用 32 轮非线性迭代结构 - 加解密使用相同的密钥扩展算法 - 硬件实现效率高 这些算法已在中国广泛应用于金融、电子政务、工业控制等领域,为信息系统安全提供了重要保障。 # PHP 国密算法的应用 可使用 `ext-openssl` 实现 SM2/SM3/SM4 国密算法的加解密。 `OpenSSL` 对 SM2、SM3 和 SM4 算法的支持是逐步引入的。以下是这些算法在 OpenSSL 中支持的大致时间线: ## SM3 算法: 在 `OpenSSL 1.1.1` 版本中首次引入支持。 发布日期:2018年9月11日 ## SM4 算法: 也是在 `OpenSSL 1.1.1` 版本中首次引入支持。 发布日期:2018年9月11日 ## SM2 算法: 部分支持在 `OpenSSL 1.1.1` 版本中引入。更完整的支持在后续的小版本更新中逐步增加。 对于完整且稳定的 SM2、SM3 和 SM4 支持,建议使用: - `OpenSSL 1.1.1d` 及以上版本 - 或者更新的 `OpenSSL 3.0.x` 系列 如果您需要在生产环境中使用这些算法,建议使用最新的稳定版本 `OpenSSL`,以确保获得最佳的性能和安全性。 # 查看 OpenSSL 对国密算法的支持情况 ## 列出支持的椭圆曲线: ```shell openssl ecparam -list_curves | grep SM2 SM2 : SM2 curve over a 256 bit prime field ``` ## 列出支持的消息摘要算法: ```shell openssl list -digest-algorithms | grep SM3 RSA-SM3 => SM3 SM3 sm3WithRSAEncryption => SM3 { 1.2.156.10197.1.401, SM3 } @ default ``` ## 列出支持的加密算法: ```shell openssl list -cipher-algorithms | grep SM4 sm4 => SM4-CBC SM4-CBC SM4-CFB SM4-CTR SM4-ECB SM4-OFB { 1.2.156.10197.1.104.1, SM4-ECB } @ default { 1.2.156.10197.1.104.3, SM4-OFB, SM4-OFB128 } @ default { 1.2.156.10197.1.104.2, SM4, SM4-CBC } @ default { 1.2.156.10197.1.104.7, SM4-CTR } @ default { 1.2.156.10197.1.104.4, SM4-CFB, SM4-CFB128 } @ default ``` # PHP 国密加解密代码实例 ## 测试内容 ```php $plaintext = "Hello, SM algorithms!"; ``` ## SM2 ```php // SM2 加密和解密 function sm2Encrypt($publicKey, $data) { $pubkeyid = openssl_pkey_get_public($publicKey); openssl_public_encrypt($data, $encrypted, $pubkeyid, OPENSSL_PKCS1_PADDING); return base64_encode($encrypted); } function sm2Decrypt($privateKey, $encryptedData) { $prikeyid = openssl_pkey_get_private($privateKey); openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $prikeyid, OPENSSL_PKCS1_PADDING); return $decrypted; } // SM2 公钥 $sm2PublicKey = "-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAELRNdo1KPkzyU5MjlhGBbVi3pBkR cJHHVq+mEQoiqOHKoH1PlzBvpTkhN/GHpyMoRZQtdHZ+orXeNZXJvNHPLw== -----END PUBLIC KEY-----"; // SM2 私钥 $sm2PrivateKey = "-----BEGIN EC PRIVATE KEY----- MHcCAQEEIFCkl6v9zOSNcxPgOjlVPJH+Ar2AzBGidLHoWMfuKyQdoAoGCCqBHM9V AYItoUQDQgAELRNdo1KPkzyU5Mj0lhGBbVi3pBkRcJHHVq+mEQoiqOHKoH1PlzBv pTkhN/GHpyMoRZQtdHZ+orXeNZXJvNHPLw== -----END EC PRIVATE KEY-----"; // SM2 测试 $sm2Encrypted = sm2Encrypt($sm2PublicKey, $plaintext); $sm2Decrypted = sm2Decrypt($sm2PrivateKey, $sm2Encrypted); echo "SM2 Decrypted: $sm2Decrypted\n"; ``` ## SM3 ```php // SM3 哈希 function sm3Hash($data) { return openssl_digest($data, 'sm3'); } // SM3 测试 $sm3Hashed = sm3Hash($plaintext); echo "SM3 Hash: $sm3Hashed\n"; ``` ## SM4 ```php $sm4Key = openssl_random_pseudo_bytes(16); // 128-bit key $sm4Iv = openssl_random_pseudo_bytes(16); // 128-bit IV // SM4 加密和解密 function sm4Encrypt($key, $iv, $data) { return openssl_encrypt($data, 'sm4-cbc', $key, 0, $iv); } function sm4Decrypt($key, $iv, $encryptedData) { return openssl_decrypt($encryptedData, 'sm4-cbc', $key, 0, $iv); } // SM4 测试 $sm4Encrypted = sm4Encrypt($sm4Key, $sm4Iv, $plaintext); $sm4Decrypted = sm4Decrypt($sm4Key, $sm4Iv, $sm4Encrypted); echo "SM4 Decrypted: $sm4Decrypted\n"; ``` 请注意与其他语言对接时,必须要使用正确的补位算法,否则可能会产生错误的数据。 - SM4-CBC - SM4-CFB - SM4-CTR - SM4-ECB - SM4-OFB
发布于2年前 · 1 次浏览 · 来自
分享
Rango-H
# 国密算法介绍 SM2、SM3 和 SM4 是中国国家密码管理局制定的一系列商用密码算法标准,主要用于替代国际上广泛使用的 RSA、SHA、AES 等算法。 ## SM2 算法 SM2 是一种椭圆曲线公钥密码算法,用于数字签名、密钥交换和公钥加密。其主要特点包括: - 基于 256 位椭圆曲线 - 安全性与 RSA-2048 相当 - 计算效率高于 RSA - 支持密钥协商、数字签名和公钥加密功能 ## SM3 算法 SM3 是一种密码散列算法,用于数字签名及验证、消息认证码生成及验证、随机数生成等。其主要特点包括: - 输出长度为 256 位 - 类似于 SHA-256,但采用不同的压缩函数 - 抗碰撞性和抗原像性较强 ## SM4 算法 SM4 是一种分组密码算法,用于数据加密。其主要特点包括: - 分组长度和密钥长度均为 128 位 - 采用 32 轮非线性迭代结构 - 加解密使用相同的密钥扩展算法 - 硬件实现效率高 这些算法已在中国广泛应用于金融、电子政务、工业控制等领域,为信息系统安全提供了重要保障。 # PHP 国密算法的应用 可使用 `ext-openssl` 实现 SM2/SM3/SM4 国密算法的加解密。 `OpenSSL` 对 SM2、SM3 和 SM4 算法的支持是逐步引入的。以下是这些算法在 OpenSSL 中支持的大致时间线: ## SM3 算法: 在 `OpenSSL 1.1.1` 版本中首次引入支持。 发布日期:2018年9月11日 ## SM4 算法: 也是在 `OpenSSL 1.1.1` 版本中首次引入支持。 发布日期:2018年9月11日 ## SM2 算法: 部分支持在 `OpenSSL 1.1.1` 版本中引入。更完整的支持在后续的小版本更新中逐步增加。 对于完整且稳定的 SM2、SM3 和 SM4 支持,建议使用: - `OpenSSL 1.1.1d` 及以上版本 - 或者更新的 `OpenSSL 3.0.x` 系列 如果您需要在生产环境中使用这些算法,建议使用最新的稳定版本 `OpenSSL`,以确保获得最佳的性能和安全性。 # 查看 OpenSSL 对国密算法的支持情况 ## 列出支持的椭圆曲线: ```shell openssl ecparam -list_curves | grep SM2 SM2 : SM2 curve over a 256 bit prime field ``` ## 列出支持的消息摘要算法: ```shell openssl list -digest-algorithms | grep SM3 RSA-SM3 => SM3 SM3 sm3WithRSAEncryption => SM3 { 1.2.156.10197.1.401, SM3 } @ default ``` ## 列出支持的加密算法: ```shell openssl list -cipher-algorithms | grep SM4 sm4 => SM4-CBC SM4-CBC SM4-CFB SM4-CTR SM4-ECB SM4-OFB { 1.2.156.10197.1.104.1, SM4-ECB } @ default { 1.2.156.10197.1.104.3, SM4-OFB, SM4-OFB128 } @ default { 1.2.156.10197.1.104.2, SM4, SM4-CBC } @ default { 1.2.156.10197.1.104.7, SM4-CTR } @ default { 1.2.156.10197.1.104.4, SM4-CFB, SM4-CFB128 } @ default ``` # PHP 国密加解密代码实例 ## 测试内容 ```php $plaintext = "Hello, SM algorithms!"; ``` ## SM2 ```php // SM2 加密和解密 function sm2Encrypt($publicKey, $data) { $pubkeyid = openssl_pkey_get_public($publicKey); openssl_public_encrypt($data, $encrypted, $pubkeyid, OPENSSL_PKCS1_PADDING); return base64_encode($encrypted); } function sm2Decrypt($privateKey, $encryptedData) { $prikeyid = openssl_pkey_get_private($privateKey); openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $prikeyid, OPENSSL_PKCS1_PADDING); return $decrypted; } // SM2 公钥 $sm2PublicKey = "-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAELRNdo1KPkzyU5MjlhGBbVi3pBkR cJHHVq+mEQoiqOHKoH1PlzBvpTkhN/GHpyMoRZQtdHZ+orXeNZXJvNHPLw== -----END PUBLIC KEY-----"; // SM2 私钥 $sm2PrivateKey = "-----BEGIN EC PRIVATE KEY----- MHcCAQEEIFCkl6v9zOSNcxPgOjlVPJH+Ar2AzBGidLHoWMfuKyQdoAoGCCqBHM9V AYItoUQDQgAELRNdo1KPkzyU5Mj0lhGBbVi3pBkRcJHHVq+mEQoiqOHKoH1PlzBv pTkhN/GHpyMoRZQtdHZ+orXeNZXJvNHPLw== -----END EC PRIVATE KEY-----"; // SM2 测试 $sm2Encrypted = sm2Encrypt($sm2PublicKey, $plaintext); $sm2Decrypted = sm2Decrypt($sm2PrivateKey, $sm2Encrypted); echo "SM2 Decrypted: $sm2Decrypted\n"; ``` ## SM3 ```php // SM3 哈希 function sm3Hash($data) { return openssl_digest($data, 'sm3'); } // SM3 测试 $sm3Hashed = sm3Hash($plaintext); echo "SM3 Hash: $sm3Hashed\n"; ``` ## SM4 ```php $sm4Key = openssl_random_pseudo_bytes(16); // 128-bit key $sm4Iv = openssl_random_pseudo_bytes(16); // 128-bit IV // SM4 加密和解密 function sm4Encrypt($key, $iv, $data) { return openssl_encrypt($data, 'sm4-cbc', $key, 0, $iv); } function sm4Decrypt($key, $iv, $encryptedData) { return openssl_decrypt($encryptedData, 'sm4-cbc', $key, 0, $iv); } // SM4 测试 $sm4Encrypted = sm4Encrypt($sm4Key, $sm4Iv, $plaintext); $sm4Decrypted = sm4Decrypt($sm4Key, $sm4Iv, $sm4Encrypted); echo "SM4 Decrypted: $sm4Decrypted\n"; ``` 请注意与其他语言对接时,必须要使用正确的补位算法,否则可能会产生错误的数据。 - SM4-CBC - SM4-CFB - SM4-CTR - SM4-ECB - SM4-OFB
赞
1
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
还没有评论!