PHPでの署名公開鍵、秘密鍵(SHA1withRSA署名)およびAES(AES/ECB/PKCS5Padding)暗号化と復号化の詳細な説明

http リクエストはステートレスであるため、リクエスタが誰であるかはわかりません。受信者と要求者は、相互の信頼を獲得し、次のビジネス ロジック交換を行うために、検証のための署名方法を交渉します。

その中で、最も一般的に使用される署名は公開キーと秘密キーであり、署名に秘密キー、署名の検証に公開キー、または暗号化に公開キーと復号化に秘密キーを使用します。

公開鍵か秘密鍵かに関係なく、最初にフォーマットする必要がありますが、フォーマット済みの鍵を取得した場合は、この手順を無視しても問題ありません。

1. 公開鍵と秘密鍵のフォーマット

********************私钥格式化********************/

function formatPriKey($priKey) {
    $fKey = "-----BEGIN PRIVATE KEY-----\n";
    $len = strlen($priKey);
    for($i = 0; $i < $len; ) {
        $fKey = $fKey . substr($priKey, $i, 64) . "\n";
        $i += 64;
    }
    $fKey .= "-----END PRIVATE KEY-----";
    return $fKey;
}
/********************公钥格式化********************/
function formatPubKey($pubKey) {
    $fKey = "-----BEGIN PUBLIC KEY-----\n";
    $len = strlen($pubKey);
    for($i = 0; $i < $len; ) {
        $fKey = $fKey . substr($pubKey, $i, 64) . "\n";
        $i += 64;
    }
    $fKey .= "-----END PUBLIC KEY-----";
    return $fKey;
}

フォーマットとは、サフィックスとサフィックスを追加し、64 ビットごとにラップすることを意味します。次のように単純にフォーマットすることもできます。

//私钥格式化
$fKey = "-----BEGIN PRIVATE KEY-----\n".chunk_split($public_key, 64,"\n").'-----END PRIVATE KEY-----';

//公钥格式化
$fKey = "-----BEGIN PUBLIC KEY-----\n".chunk_split($public_key, 64,"\n").'-----END PUBLIC KEY-----';

2. 秘密鍵署名と公開鍵署名の検証(SHA1withRSA)

/********************私钥签名********************/
function get_private_sign($sign_str,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $private_key = openssl_pkey_get_private(private_key);//加载密钥
    openssl_sign($sign_str,$signature,$private_key,$signature_alg);//生成签名
    $signature = base64_encode($signature);
    openssl_free_key($private_key);
    return $signature;
}
/********************公钥验签********************/
function public_verify($sign_str,$sign,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $public_key = openssl_get_publickey($public_key);
    $verify = openssl_verify($sign_str, base64_decode($sign), $public_key, $signature_alg);
    openssl_free_key($public_key);
    return $verify==1;//false or true
}

$sign_str は署名文字列または署名検証文字列、$sign は署名です。公開キーと秘密キーはフォーマットされている必要があります。フォーマットされていないと認識されません。

3. 公開鍵暗号化と秘密鍵復号化(SHA1withRSA)

/********************公钥加密********************/
function get_public_sign($sign_str,$public_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $public_key = openssl_pkey_get_public($public_key);//加载密钥
    openssl_sign($sign_str,$signature,$public_key,$signature_alg);//生成签名
    $signature = base64_encode($signature);
    openssl_free_key($public);
    return $signature;
}

/********************私钥解密********************/
 function private_verify($sign_str,$sign,$private_key,$signature_alg=OPENSSL_ALGO_SHA1){
    $private_key = openssl_get_privatekey($private_key);
    $verify = openssl_verify($sign_str, base64_decode($sign), $private_key, $signature_alg);
    openssl_free_key($private_key);
    return $verify==1;//false or true
}

 4. AES (AES/ECB/PKCS5Padding) 暗号化と復号化

//aes加密
function encrypt($data, $key) {
    $data =  openssl_encrypt($data, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
    return base64_encode($data);
}
//aes解密
function decrypt($data, $key) {
     $encrypted = base64_decode($data);
     return openssl_decrypt($encrypted, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
 }

おすすめ

転載: blog.csdn.net/meimeieee/article/details/112143482