Wie mache ich AES 256-bit ECB-Modus, PKCS5 Padding-Verschlüsselung arbeitet zwischen Java und PHP?

Ich habe ein Java-Programm, das verschlüsseln mit AES/ECB/PKCS5Padding cipher mit 256-bit-Schlüssel, und ich möchte ein PHP Skript zu schreiben, das produzieren das gleiche Ergebnis.

Aber mein script nicht. Ich habe irgendwie ein Gefühl, dass, wie Sie den Schlüssel vor der Verschlüsselung ist das problem, aber kann ich nicht sagen.

Könnte jemand darauf hinweisen, was falsch in der PHP-Skript ?

Dank.

Hier sind die Beispiel-codes, können Sie einfach starten Sie es nach copy & paste:

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');
  • Nie ECB. Es ist deterministisch und daher nicht semantisch sicher. Sie sollten zumindest die Verwendung einer randomisierten Modus wie CBC oder WDR. Es ist besser, sich zu authentifizieren, Ihre ciphertexts, so dass Angriffe wie ein padding-oracle-Angriff sind nicht möglich. Diese kann getan werden, mit authentifizierten Modi wie GCM oder EAX, oder mit einem encrypt-dann-MAC - Schema.
  • Und verwenden Sie nicht mcrypt_* * Funktionen in PHP.
  • Immer interessant zu sehen, Menschen gehen durch all diese Schritte erzeugen eine IV-für ECB-Modus.
  • Ich weiß nicht, warum mein Kommentar fehlt, so lassen Sie mich, sagte es wieder, es ist erforderlich, um die Integration mit 3rd-party-Zusammenarbeit
InformationsquelleAutor Rangi Lin | 2016-07-29
Schreibe einen Kommentar