toString('PKCS1'); $publicPem = $privateKey->getPublicKey()->toString('PKCS8'); return [ 'private' => $privatePem, 'public' => $publicPem, ]; } /** * 签名 * * @param string $data * @param string $privatePem * * @return string */ public static function sign(string $data, string $privatePem): string { $privateKey = PublicKeyLoader::loadPrivateKey($privatePem) ->withHash('sha256') ->withPadding(RSA::SIGNATURE_PKCS1); return $privateKey->sign($data); } /** * 验证签名 * * @param string $data * @param string $signature * @param string $publicPem * * @return bool */ public static function verify(string $data, string $signature, string $publicPem): bool { $publicKey = PublicKeyLoader::load($publicPem) ->withHash('sha256') ->withPadding(RSA::SIGNATURE_PKCS1); return $publicKey->verify($data, $signature); } /** * 公钥加密 * * @param string $data * @param string $publicPem * * @return string */ public static function encrypt(string $data, string $publicPem): string { $publicKey = PublicKeyLoader::load($publicPem)->withPadding(RSA::ENCRYPTION_PKCS1); return base64_encode($publicKey->encrypt($data)); } /** * 私钥解密 * * @param string $cipherBase64 * @param string $privatePem * * @return string */ public static function decrypt(string $cipherBase64, string $privatePem): string { $privateKey = PublicKeyLoader::loadPrivateKey($privatePem) ->withPadding(RSA::ENCRYPTION_PKCS1); $cipher = base64_decode($cipherBase64); return $privateKey->decrypt($cipher); } public static function encryptOaep(string $data, string $publicPem): string { $publicKey = PublicKeyLoader::load($publicPem) ->withHash('sha256') ->withMGFHash('sha256') ->withPadding(RSA::ENCRYPTION_OAEP); return base64_encode($publicKey->encrypt($data)); } public static function decryptOaep(string $cipherBase64, string $privatePem): string { $privateKey = PublicKeyLoader::loadPrivateKey($privatePem) ->withHash('sha256') ->withMGFHash('sha256') ->withPadding(RSA::ENCRYPTION_OAEP); $cipher = base64_decode($cipherBase64); return $privateKey->decrypt($cipher); } /** * 公钥掩码显示 * * @param string $pem * @param int $keep * * @return string */ public static function maskKey(string $pem, int $keep = 20): string { $clean = str_replace( ["\r", "\n", "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----"], '', $pem ); $len = strlen($clean); return substr($clean, 0, $keep) . '...' . substr($clean, -$keep); } }