Question Chiffrer et déchiffrer du texte avec RSA en PHP


Y at-il une classe pour PHP 5.3 qui fournira le chiffrement / déchiffrement de texte avec RSA sans remplissage?

J'ai la clé privée et publique, p, q et le module.


30
2017-12-19 17:43


origine


Réponses:


Vous pouvez utiliser phpseclib, une implémentation pure PHP RSA:

<?php
include('Crypt/RSA.php');

$privatekey = file_get_contents('private.key');

$rsa = new Crypt_RSA();
$rsa->loadKey($privatekey);

$plaintext = new Math_BigInteger('aaaaaa');
echo $rsa->_exponentiate($plaintext)->toBytes();
?>

41
2017-12-26 15:39



class MyEncryption
{

    public $pubkey = '...public key here...';
    public $privkey = '...private key here...';

    public function encrypt($data)
    {
        if (openssl_public_encrypt($data, $encrypted, $this->pubkey))
            $data = base64_encode($encrypted);
        else
            throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');

        return $data;
    }

    public function decrypt($data)
    {
        if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey))
            $data = $decrypted;
        else
            $data = '';

        return $data;
    }
}

19
2017-12-19 17:45



Aucune application écrite en 2017 (ou par la suite) qui a l'intention d'incorporer une cryptographie sérieuse ne devrait plus utiliser RSA. Il y a meilleures options pour la cryptographie à clé publique PHP.

Il y a deux grosses erreurs que font les gens quand ils décident de chiffrer avec RSA:

  1. Les développeurs choisissent le mauvais mode de remplissage.
  2. Étant donné que RSA ne peut pas, à lui seul, chiffrer des chaînes très longues, les développeurs séparent souvent une chaîne en petits blocs et chiffrent chaque bloc indépendamment. Un peu comme Mode ECB.

La meilleure alternative: sodium_crypto_box_seal() (libsodium)

$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair);
// ...
$encrypted = sodium_crypto_box_seal(
    $plaintextMessage,
    $publicKey
);
// ...
$decrypted = sodium_crypto_box_seal_open(
    $encrypted,
    $keypair
);

Simple et sécurisé Libsodium sera disponible en PHP 7.2 ou via PECL pour les versions antérieures de PHP. Si vous avez besoin d'un polyfill PHP pur, obtenez paragonie / sodium_compat.

À contrecœur: utiliser correctement RSA

La seule raison d’utiliser RSA en 2017 est la suivante: «Je ne peux pas installer les extensions PECL et je ne peux donc pas utiliser libsodium, et pour une raison quelconque ne peut pas utiliser paragonie / sodium_compat non plus."

Votre protocole devrait ressembler à ceci:

  1. Générez une clé AES aléatoire.
  2. Chiffrez votre texte en clair avec la clé AES, en utilisant un mode de chiffrement AEAD ou, à défaut, CBC puis HMAC-SHA256.
  3. Cryptez votre clé AES (étape 1) avec votre clé publique RSA, en utilisant RSAES-OAEP + MGF1-SHA256
  4. Concaténez votre clé AES cryptée RSA (étape 3) et votre message crypté AES (étape 2).

Au lieu de l'implémenter vous-même, consultez EasyRSA.


7
2017-12-04 12:20



Oui. Regarder http://jerrywickey.com/test/testJerrysLibrary.php

Il donne des exemples de code pour le chiffrement et le déchiffrement RSA en PHP, ainsi que le chiffrement RSA en javascript.

Si vous voulez chiffrer du texte au lieu de simplement des nombres de base 10, vous aurez également besoin d'une base pour convertir la base. C'est convertir le texte en un très grand nombre. Le texte écrit en base 63. 26 lettres minuscules plus 26 majuscules + 10 chiffres + espace. Le code pour cela est ci-dessous aussi.

Le paramètre $ GETn est un nom de fichier contenant des clés pour les fonctions de cryption. Si vous ne le trouvez pas, demandez. J'aiderai.

J'ai en fait posté toute cette bibliothèque de chiffrement hier, mais Brad Larson, un mod, l'a tué et a déclaré que ce genre de choses ne correspondait pas vraiment à Stack Overflow. Mais vous pouvez toujours trouver tous les exemples de code et toute la bibliothèque de fonctions pour effectuer le déchiffrement du chiffrement client / serveur pour AJAX sur le lien ci-dessus.

function RSAencrypt( $num, $GETn){
    if ( file_exists( 'temp/bigprimes'.hash( 'sha256', $GETn).'.php')){
        $t= explode( '>,', file_get_contents('temp/bigprimes'.hash( 'sha256', $GETn).'.php'));
        return JL_powmod( $num, $t[4], $t[10]); 
    }else{
        return false;
    }
}

function RSAdecrypt( $num, $GETn){
    if ( file_exists( 'temp/bigprimes'.hash( 'sha256', $GETn).'.php')){
        $t= explode( '>,', file_get_contents('temp/bigprimes'.hash( 'sha256', $GETn).'.php'));
        return JL_powmod( $num, $t[8], $t[10]);     
    }else{
        return false;
    }
}

function JL_powmod( $num, $pow, $mod) {
    if ( function_exists('bcpowmod')) {
        return bcpowmod( $num, $pow, $mod);
    }
    $result= '1';
    do {
        if ( !bccomp( bcmod( $pow, '2'), '1')) {
            $result = bcmod( bcmul( $result, $num), $mod);
        }
       $num = bcmod( bcpow( $num, '2'), $mod);

       $pow = bcdiv( $pow, '2');
    } while ( bccomp( $pow, '0'));
    return $result;
}

function baseToBase ($message, $fromBase, $toBase){
    $from= strlen( $fromBase);
    $b[$from]= $fromBase; 
    $to= strlen( $toBase);
    $b[$to]= $toBase; 

    $result= substr( $b[$to], 0, 1);

    $f= substr( $b[$to], 1, 1);

    $tf= digit( $from, $b[$to]);

    for ($i=strlen($message)-1; $i>=0; $i--){
        $result= badd( $result, bmul( digit( strpos( $b[$from], substr( $message, $i, 1)), $b[$to]), $f, $b[$to]), $b[$to]);
        $f= bmul($f, $tf, $b[$to]);
    }
    return $result;
} 

function digit( $from, $bto){   
    $to= strlen( $bto);
    $b[$to]= $bto; 

    $t[0]= intval( $from);
    $i= 0;
    while ( $t[$i] >= intval( $to)){
        if ( !isset( $t[$i+1])){ 
            $t[$i+1]= 0;
        }
        while ( $t[$i] >= intval( $to)){
            $t[$i]= $t[$i] - intval( $to);
            $t[$i+1]++;
        }
        $i++;
    }

    $res= '';
    for ( $i=count( $t)-1; $i>=0; $i--){ 
        $res.= substr( $b[$to], $t[$i], 1);
    }
    return $res;
}   

function badd( $n1, $n2, $nbase){
    $base= strlen( $nbase);
    $b[$base]= $nbase; 

    while ( strlen( $n1) < strlen( $n2)){
        $n1= substr( $b[$base], 0, 1) . $n1;
    }
    while ( strlen( $n1) > strlen( $n2)){
        $n2= substr( $b[$base], 0, 1) . $n2;
    }
    $n1= substr( $b[$base], 0, 1) . $n1;    
    $n2= substr( $b[$base], 0, 1) . $n2;
    $m1= array();
    for ( $i=0; $i<strlen( $n1); $i++){
        $m1[$i]= strpos( $b[$base], substr( $n1, (strlen( $n1)-$i-1), 1));
    }   
    $res= array();
    $m2= array();
    for ($i=0; $i<strlen( $n1); $i++){
        $m2[$i]= strpos( $b[$base], substr( $n2, (strlen( $n1)-$i-1), 1));
        $res[$i]= 0;
    }           
    for ($i=0; $i<strlen( $n1)  ; $i++){
        $res[$i]= $m1[$i] + $m2[$i] + $res[$i];
        if ($res[$i] >= $base){
            $res[$i]= $res[$i] - $base;
            $res[$i+1]++;
        }
    }
    $o= '';
    for ($i=0; $i<strlen( $n1); $i++){
        $o= substr( $b[$base], $res[$i], 1).$o;
    }   
    $t= false;
    $o= '';
    for ($i=strlen( $n1)-1; $i>=0; $i--){
        if ($res[$i] > 0 || $t){    
            $o.= substr( $b[$base], $res[$i], 1);
            $t= true;
        }
    }
    return $o;
}
function bmul( $n1, $n2, $nbase){
    $base= strlen( $nbase);
    $b[$base]= $nbase; 

    $m1= array();
    for ($i=0; $i<strlen( $n1); $i++){
        $m1[$i]= strpos( $b[$base], substr($n1, (strlen( $n1)-$i-1), 1));
    }   
    $m2= array();
    for ($i=0; $i<strlen( $n2); $i++){
        $m2[$i]= strpos( $b[$base], substr($n2, (strlen( $n2)-$i-1), 1));
    }           
    $res= array();
    for ($i=0; $i<strlen( $n1)+strlen( $n2)+2; $i++){
        $res[$i]= 0;
    }
    for ($i=0; $i<strlen( $n1)  ; $i++){
        for ($j=0; $j<strlen( $n2)  ; $j++){
            $res[$i+$j]= ($m1[$i] * $m2[$j]) + $res[$i+$j];
            while ( $res[$i+$j] >= $base){
                $res[$i+$j]= $res[$i+$j] - $base;
                $res[$i+$j+1]++;
            }
        }
    }
    $t= false;
    $o= '';
    for ($i=count( $res)-1; $i>=0; $i--){
        if ($res[$i]>0 || $t){  
            $o.= substr( $b[$base], $res[$i], 1);
            $t= true;
        }
    }
    return $o;
}

2
2018-02-11 13:11