Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java

Ist Prost für gute Arbeit! Ich bin Ishiguro von GMO Research!

Ich denke übrigens, dass Sie plötzlich aufgefordert werden, mit AES zu verschlüsseln. Für diejenigen unter Ihnen werden wir dieses Mal verschlüsselten / zusammengesetzten Code in insgesamt drei Methoden schreiben: Java und PHP, PHP ist OpenSSL und Mcrypt. Es ist mit AES256-Algorithmus, EZB-Modus und PKCS5-Padding implementiert.

Ausführung

Java 1.8 PHP 5.6

Java

Standardmäßig kann Java nur AES-Schlüssellängen von 128 Bit verarbeiten. Um 256-Bit-Schlüssel verarbeiten zu können, muss die Java-Richtliniendatei ersetzt werden.

Weitere Informationen finden Sie in Artikeln wie AES256 in Java verfügbar machen.

aes01.java


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

public class aes01 {

	public static void main(String[] args) {
		try {
			byte[] key = DatatypeConverter.parseBase64Binary(
                    "Base64-codierte Schlüsselfolge");
			SecretKeySpec sks = new SecretKeySpec(key, "AES");

			byte[] input = "Die Zeichenfolge, die Sie verschlüsseln möchten".getBytes();

			//Verschlüsselung
			Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
			c.init(Cipher.ENCRYPT_MODE, sks);
			byte encrypted[] = c.doFinal(input);

			System.out.println(DatatypeConverter.printBase64Binary(encrypted));

			//Entschlüsselung
			c.init(Cipher.DECRYPT_MODE, sks);
			byte decrypted[] = c.doFinal(encrypted);

			System.out.println(new String(decrypted));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

PHP(OpenSSL)

Die Verschlüsselung mit PHP5.3 oder höher erfolgt mit OpenSSL.

aes01.php


<?php
$key = base64_decode("Base64-codierte Schlüsselfolge");

$input = 'Die Zeichenfolge, die Sie verschlüsseln möchten';

//Verschlüsselung
$encrypted = openssl_encrypt($input, 'aes-256-ecb', $key);

echo $encrypted;

//Entschlüsselung
$decrypted = openssl_decrypt($encrypted, 'aes-256-ecb', $key);

echo $decrypted;

PHP (Mcrypt) * Nicht empfohlen

Verschlüsselung veraltet. Verwenden Sie es nur bei Bedarf. Oder besser gesagt, es ist zu nervig.

aes02.php


<?php
$key = base64_decode('Base64-codierte Schlüsselfolge');

$input = 'Die Zeichenfolge, die Sie verschlüsseln möchten';

$crypt = new Crypt($key);

//Verschlüsselung
$encrypted = base64_encode($crypt->encrypt($input));

echo $encrypted;

//Entschlüsselung
$decrypted = $crypt->decrypt(base64_decode($encrypted));

echo $decrypted;

class Crypt {

    private $__encrypt_key = null;

    public $iv = null;

    public function __construct($encrypt_key) {
        $this->__encrypt_key = $encrypt_key;
    }

    public function encrypt($input, $algo = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_ECB) {
        list($size, $td) = $this->__open($algo, $mode);
        $input = $this->__pkcs5Pad($input, $size);
        $data = mcrypt_generic($td, $input);
        $this->__close($td);
        return $data;
    }

    public function decrypt($input, $algo = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_ECB) {
        list ($size, $td) = $this->__open($algo, $mode);
        $input = mdecrypt_generic($td, $input);
        $data = $this->__pkcs5Unpad($input);
        $this->__close($td);
        return $data;
    }

    private function __open($algo, $mode) {
        $size = mcrypt_get_block_size($algo, $mode);
        $td = mcrypt_module_open($algo, '', $mode, '');
        $this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $this->__encrypt_key, $this->iv);
        return array($size, $td);
    }

    private function __close($td){
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
    }

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

    public static 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);
    }
}

MCRYPT_RIJNDAEL_128 scheint AES256 zu entsprechen. Es gibt auch einen Algorithmus namens MCRYPT_RIJNDAEL_256, aber beachten Sie, dass dies nicht der Fall ist.

Derzeit ist es möglich, den Algorithmus und den Modus so zu ändern, dass er universell verwendet werden kann. Ich bin mir nicht sicher, ob es wirklich funktioniert.

abschließend

das ist alles! Damit ist es in Ordnung, vom Drang getrieben zu werden, AES zu verschlüsseln.

Ich bin froh, dass PHPs OpenSSL sehr einfach ist. (Kleines Gefühl)

Recommended Posts

Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
Mit Java verschlüsseln und mit C # entschlüsseln
[Java] Verschlüsselung mit AES-Verschlüsselung mit Standardbibliothek
In Java 2D-Karte speichern und mit for-Anweisung drehen
Protokollaggregation und -analyse (Arbeiten mit AWS Athena in Java)
Ich habe PHP- und Java-Konstruktoren verglichen
Morphologische Analyse in Java mit Kuromoji
Verwenden Sie Java mit MSYS und Cygwin
Verteilte Ablaufverfolgung mit OpenCensus und Java
Beispiel für Codierung und Decodierung in Java
Verwenden Sie JDBC mit Java und Scala.
Implementieren Sie die PHP-Implodierungsfunktion in Java
StringBuffer- und StringBuilder-Klasse in Java
PDF und TIFF mit Java 8 ausgeben
Tweak Markdown mit Java Flexmark-Java
Hallo Welt in Java und Gradle
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy
Unterschied zwischen final und Immutable in Java
Überwachen Sie Java-Anwendungen mit Jolokia und Hawtio
Schriftliche Unterschiede in Ruby, PHP, Java, JS
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Erreichen Sie eine OpenSSL-kompatible Verschlüsselung mit Java / PHP
Probieren wir WebSocket mit Java und Javascript aus!
[Java] Lesen und Schreiben von Dateien mit OpenCSV
HTTPS mit Spring Boot und Let's Encrypt
Lesen Sie die xlsx-Datei in Java mit Selenium
Ich habe eine Lambda-Funktion in Java geschrieben und mit SAM bereitgestellt
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Behandeln Sie große JSON mit Java Lambda
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Die Richtung von Java in "C ++ Design and Evolution"
Von Java nach C und von C nach Java in Android Studio
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
Diskriminierung von Enum in Java 7 und höher
Seien Sie vorsichtig mit Anfragen und Antworten, wenn Sie das Serverless Framework mit Java verwenden
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Überarbeitetes GUI-Tool, das 2016 mit Java8 + JavaFX erstellt wurde
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Parallele und parallele Verarbeitung in verschiedenen Sprachen (Java Edition)
Unterschied zwischen next () und nextLine () in Java Scanner
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Versuchen Sie, Ruby und Java in Dapr zu integrieren
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
Textextraktion in Java aus PDF mit pdfbox-2.0.8
Erfassen und speichern Sie die Selen-Installation in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
Üben Sie die Arbeit mit Unicode-Ersatzpaaren in Java