Explicación detallada del cifrado y descifrado de clave pública de firma, clave privada (SHA1con firma RSA) y AES (AES/ECB/PKCS5Padding) en php

Dado que las solicitudes http no tienen estado, no sabemos quién es el solicitante. Así nació la firma: el receptor y el solicitante negociaron un método de firma para la verificación para ganar confianza mutua y llevar a cabo el siguiente paso del intercambio de lógica empresarial.

Entre ellas, las firmas más utilizadas son la clave pública y la clave privada, utilizando la clave privada para firmar, la clave pública para verificar la firma o la clave pública para cifrar y la clave privada para descifrar.

Independientemente de si es una clave pública o privada, primero debemos formatearla, por supuesto, si obtienes la clave formateada, puedes ignorar este paso.

1. Formateo de claves públicas y privadas.

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

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;
}

Formatear significa agregar sufijos y sufijos y luego ajustar cada 64 bits. También puede formatear simplemente de la siguiente manera:

//私钥格式化
$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. Verificación de firma de clave privada y firma de clave pública (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 es la cadena de firma o cadena de verificación de firma, $sign es la firma y las claves pública y privada deben estar formateadas; de lo contrario, no serán reconocidas.

3. Cifrado de clave pública y descifrado de clave privada (SHA1conRSA)

/********************公钥加密********************/
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. Cifrado y descifrado 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);
 }

Supongo que te gusta

Origin blog.csdn.net/meimeieee/article/details/112143482
Recomendado
Clasificación