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');
** 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. –
Und verwenden Sie nicht mcrypt_ * -Funktionen in PHP. –
Es ist immer interessant zu sehen, wie Leute all diese Schritte durchlaufen und einen IV für den ECB-Modus generieren. –