encriptar - php cifrar
Cifrar y descifrar texto con RSA en PHP (4)
Ninguna aplicación escrita en 2017 (o posterior) que intente incorporar una criptografía seria debería usar RSA. Hay mejores opciones para la criptografía de clave pública PHP .
Hay dos grandes errores que las personas cometen cuando deciden encriptar con RSA:
- Los desarrolladores eligen el modo de relleno incorrecto .
- Como RSA no puede, por sí mismo, cifrar cadenas muy largas, los desarrolladores a menudo dividirán una cadena en pequeños fragmentos y encriptarán cada fragmento de manera independiente. Algo así como el modo ECB .
La mejor alternativa: 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 y seguro. Libsodium estará disponible en PHP 7.2, o mediante PECL para versiones anteriores de PHP. Si necesita un polyfill puro de PHP, obtenga paragonie/sodium_compat .
A regañadientes: utilizando RSA correctamente
La única razón para usar RSA en 2017 es: "Tengo prohibido instalar extensiones PECL y, por lo tanto, no puedo usar libsodium y, por alguna razón, tampoco puedo usar paragonie / sodium_compat ".
Su protocolo debe verse más o menos así:
- Genera una clave AES aleatoria.
- Encripte su mensaje de texto plano con la tecla AES, usando un modo de cifrado AEAD o, en su defecto, CBC y luego HMAC-SHA256.
- Encripte su clave AES (paso 1) con su clave pública RSA, utilizando RSAES-OAEP + MGF1-SHA256
- Concatenar su clave AES encriptada con RSA (paso 3) y mensaje encriptado AES (paso 2).
En lugar de implementarlo usted mismo, consulte EasyRSA .
¿Existe alguna clase para PHP 5.3 que proporcione cifrado / descifrado de texto con RSA sin relleno?
Tengo clave privada y pública, p, q y módulo.
Puede usar phpseclib, una implementación pura de 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();
?>
Sí. Mira http://jerrywickey.com/test/testJerrysLibrary.php
Proporciona ejemplos de ejemplos de código para el cifrado y descifrado RSA en PHP, así como el cifrado RSA en JavaScript.
Si desea encriptar texto en lugar de simplemente 10 números base, también necesitará una conversión de base a base. Eso es convertir el texto a un número muy grande. El texto en realidad solo está escribiendo en la base 63. 26 letras minúsculas más 26 mayúsculas + 10 números + carácter de espacio. El código para eso está abajo también.
El parámetro $ GETn es un nombre de archivo que contiene claves para las funciones de cifrado. Si no lo resuelves, pregunta. Ayudaré.
Ayer publiqué esta biblioteca de encriptación completa, pero Brad Larson un mod, lo mató y dijo que este tipo de cosas no es de lo que se trata . Pero aún puede encontrar todos los ejemplos de código y toda la biblioteca de funciones para llevar a cabo el descifrado de cifrado de cliente / servidor para AJAX en el enlace anterior.
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;
}
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;
}
}