2016-07-29 16 views
0

Ich habe ein Java-Programm, das mit AES/ECB/PKCS5Padding Verschlüsselung mit 256bit Schlüssel verschlüsseln kann, und ich möchte ein PHP-Skript schreiben, die das gleiche Ergebnis produzieren.Wie mache ich AES 256-Bit, ECB-Modus, PKCS5 Padding-Verschlüsselung funktioniert zwischen Java und PHP?

Allerdings konnte mein Skript dies nicht tun. Ich habe irgendwie das Gefühl, dass sie den Schlüssel vor der Verschlüsselung verarbeiten, aber das kann ich nicht sagen.

Kann jemand darauf hinweisen, was im PHP-Skript falsch ist?

Danke.

Hier sind die Beispiel-Codes, können Sie es einfach nach dem Kopieren & Paste laufen:

Java

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 
import javax.xml.bind.DatatypeConverter; 
import java.security.MessageDigest; 

public class JavaCipher { 

    private SecretKeySpec secretKey; 

    private JavaCipher(String secret) throws Exception { 
     MessageDigest sha = MessageDigest.getInstance("SHA-256"); 
     byte[] digest = sha.digest(secret.getBytes("UTF-8")); 
     secretKey = new SecretKeySpec(digest, "AES"); 
    } 

    private String encrypt(String sSrc) throws Exception { 
     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     byte[] encrypted = cipher.doFinal(sSrc.getBytes()); 
     return DatatypeConverter.printHexBinary(encrypted).toLowerCase(); 
    } 

    public static void main(String[] args) throws Exception { 
     JavaCipher cipher = new JavaCipher("some random key"); 

     // print d013acccb5d191a00898ac87057383ff 
     System.out.println(cipher.encrypt("abcdefg")); 
    } 
} 

PHP

<?php 

class PHPCipher { 

    private $key; 

    public function __construct($key) 
    { 
     $this->key = substr(hash('sha256', $key), 0, 32); 
    } 

    public function encrypt($data) 
    { 
     $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); 
     $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); 
     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
     mcrypt_generic_init($td, $this->key, $iv); 
     $result = mcrypt_generic($td, $this->pad($data, $size)); 
     mcrypt_generic_deinit($td); 
     mcrypt_module_close($td); 
     return bin2hex($result); 
    } 

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

$cipher = new PHPCipher('some random key'); 
// print 9a4df66d67a3e8d4a1dda7cda6e94d07 
echo $cipher->encrypt('abcdefg'); 
+3

** Verwenden Sie niemals [ECB-Modus] (http : //crypto.stackexchange.com/q/14487/13022) **. Es ist deterministisch und daher nicht semantisch sicher. Sie sollten zumindest einen randomisierten Modus wie [CBC] (http://crypto.stackexchange.com/q/22260/13022) oder [CTR] verwenden (http://crypto.stackexchange.com/a/2378/ 13022). Es ist besser, Ihre Chiffriertexte zu authentifizieren, so dass Angriffe wie ein [padding oracle attack] (http://crypto.stackexchange.com/q/18185/13022) nicht möglich sind. Dies kann mit authentifizierten Modi wie GCM oder EAX oder mit einem [encrypt-then-MAC] (http://crypto.stackexchange.com/q/202/13022) Schema erfolgen. –

+0

Und verwenden Sie nicht mcrypt_ * -Funktionen in PHP. –

+2

Es ist immer interessant zu sehen, wie Leute all diese Schritte durchlaufen und einen IV für den ECB-Modus generieren. –

Antwort

0

Da AES mit Schlüsselgröße 256 Bit ist, was ich brauche, alles, was ich tun muss, ist einen 32-Byte-Schlüssel bereitzustellen.

Statt die Zeichenfolge in 32 Zeichen des Schneidens (die den Schlüssel ändert):

$this->key = substr(hash('sha256', $key), 0, 32); 

ich sollte es in Binärkette Sie packen

$this->key = pack('H*', hash('sha256', $key)); 
+0

BTW, Sie haben die Wahl, den ECB-Modus zu verweigern, einfach Nein sagen und nicht ' Tu es, sonst trägst du zu schlechter Sicherheit bei. Wenn wir Softwareentwickler Profis sein wollen, müssen wir das Richtige tun. Betrachten Sie einen Bauingenieur, wenn er gebeten wird, einen Balken mit unzureichender Stärke zu verwenden, würde er es nicht tun, weil er ein Profi ist. Deine Entscheidung. – zaph

+1

Anstatt 'pack' zu verwenden, könnten Sie einfach' true' als drittes Argument von 'hash' übergeben und Sie müssen' substr' überhaupt nicht verwenden –