2016-05-31 5 views
-3

Ich habe diesen Code in Java, ich brauche das Äquivalent in PHP, ich habe diesen Code in. NET auch und funktioniert perfekt, aber ich brauche in PHP.Welches ist die äquivalente Ver-/Entschlüsselungsfunktion in PHP?

public static String decrypt(String pValor) throws UnsupportedEncodingException { 

    byte vBytesDecodificados[] = null; 

    try { 

     KeySpec vClave = new DESKeySpec("MyKey".getBytes("UTF-8")); 
     SecretKey vClaveSecreta = SecretKeyFactory.getInstance("DES").generateSecret(vClave); 

     IvParameterSpec iv = new IvParameterSpec(Hex.decodeHex("1234567890ABCDEF".toCharArray())); 

     Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, vClaveSecreta, iv); 

     vBytesDecodificados = cipher.doFinal(Base64.decodeBase64(pValor.getBytes())); 

    } catch (Exception e) { 

    } 

    return new String(vBytesDecodificados, "UTF-8"); 
} 

public static String encrypt(String pValor) throws UnsupportedEncodingException { 

    byte vBytesCodificados[] = null; 

    try { 

     KeySpec vClave = new DESKeySpec("MyKey".getBytes("UTF-8")); 
     SecretKey vClaveSecreta = SecretKeyFactory.getInstance("DES").generateSecret(vClave); 

     IvParameterSpec iv = new IvParameterSpec(Hex.decodeHex("1234567890ABCDEF".toCharArray())); 

     Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, vClaveSecreta, iv); 

     byte[] utf8 = pValor.getBytes("UTF8"); 
     byte[] enc = cipher.doFinal(utf8); 
     vBytesCodificados = Base64.encodeBase64(enc); 

    } catch (Exception e) { 

    } 

    return new String(vBytesCodificados, "UTF-8"); 
} 
+0

Blick auf [Mcrypt Bibliothek] (http://php.net/manual/en/ref .mcrypt.php). So etwas wie [mcrypt-encrypt] (http://php.net/manual/en/function.mcrypt-encrypt.php)/[mcrypt-decrypt] (http://php.net/manual/en/function.mcrypt -decrypt.php) sollte die Arbeit machen. Möglicherweise benötigen Sie auch [pack] (http://php.net/manual/en/function.pack.php), um mit Binärdaten zu arbeiten. –

+1

Es ist am besten, mcrypt nicht zu verwenden, es ist abandonware, wurde seit Jahren nicht mehr aktualisiert und unterstützt keine Standard-PKCS # 7 (bisher PKCS # 5) -Polsterung, nur Nicht-Standard-Nullauffüllung, die nicht einmal mit Binärcode verwendet werden kann Daten. mcrypt hatte viele ausstehende [Bugs] (https://sourceforge.net/p/mcrypt/bugs/), die auf das Jahr 2003 zurückgehen. Stattdessen sollten Sie [defuse] verwenden (https://github.com/defuse/php-encryption). Es wird beibehalten und ist korrekt. – zaph

+1

@AlexBlex Beachten Sie, dass der OP-Code 'PKCS5Padding' spezifiziert und mcrypt' PKCS5Padding' nicht unterstützt. – zaph

Antwort

0

ich schon weiß es nicht sicher ist, diese Methode zu verwenden, aber dies ist die Lösung:

class Encriptacion { 
    private $iv = '1234567890ABCDEF'; 
    private $key = 'MyKey'; 

    function encode($str) { 
     $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); 
     $str = $this->pkcs5Pad($str, $size); 
     $aaa = mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->hex2bin($this->iv)); 
     $ret = base64_encode($aaa); 
     return $ret; 
    } 

    function decode($str) { 
     $str = base64_decode($str); 
     $str = mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_DECRYPT, $this->hex2bin($this->iv)); 
     $str = $this->pkcs5Unpad($str); 
     return $str; 
    } 

    function hex2bin($hexData) { 
     $binData = ""; 
     for ($i = 0; $i < strlen($hexData); $i += 2) { 
      $binData .= chr(hexdec(substr($hexData, $i, 2))); 
     } 
     return $binData; 
    } 

    function pkcs5Pad($text, $blocksize) { 
     $pad = $blocksize - (strlen($text) % $blocksize); 
     return $text . str_repeat(chr($pad), $pad); 
    } 

    function pkcs5Unpad($text) { 
     $pad = ord($text {strlen($text) - 1}); 
     if ($pad > strlen($text)) 
      return false; 

     if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) 
      return false; 

     return substr($text, 0, - 1 * $pad); 
    } 
} 
Verwandte Themen