Crypter / décrypter avec AES256 en PHP et Java

Vive le bon travail! Je suis Ishiguro de GMO Research!

En passant, je pense que vous serez peut-être soudainement invité à crypter avec AES. Pour ceux d'entre vous, cette fois, nous écrirons du code crypté / composite dans un total de trois méthodes: Java et PHP, PHP est OpenSSL et Mcrypt. Il est implémenté avec l'algorithme AES256, le mode ECB, le rembourrage PKCS5.

version

Java 1.8 PHP 5.6

Java

Par défaut, Java ne peut gérer que des longueurs de clé AES de 128 bits. Pour gérer les clés de 256 bits, il est nécessaire de remplacer le fichier de stratégie Java.

Pour plus de détails, reportez-vous à des articles tels que Rendre AES256 disponible en Java.

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(
                    "Chaîne de clés encodée en base64");
			SecretKeySpec sks = new SecretKeySpec(key, "AES");

			byte[] input = "La chaîne que vous souhaitez chiffrer".getBytes();

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

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

			//Décryptage
			c.init(Cipher.DECRYPT_MODE, sks);
			byte decrypted[] = c.doFinal(encrypted);

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

PHP(OpenSSL)

Le chiffrement avec PHP5.3 ou version ultérieure est effectué avec OpenSSL.

aes01.php


<?php
$key = base64_decode("Chaîne de clés encodée en base64");

$input = 'La chaîne que vous souhaitez chiffrer';

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

echo $encrypted;

//Décryptage
$decrypted = openssl_decrypt($encrypted, 'aes-256-ecb', $key);

echo $decrypted;

PHP (Mcrypt) * Non recommandé

Chiffrement de manière obsolète. Ne l'utilisez que lorsque cela est nécessaire. Ou plutôt, c'est trop ennuyeux.

aes02.php


<?php
$key = base64_decode('Chaîne de clés encodée en base64');

$input = 'La chaîne que vous souhaitez chiffrer';

$crypt = new Crypt($key);

//chiffrement
$encrypted = base64_encode($crypt->encrypt($input));

echo $encrypted;

//Décryptage
$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 semble être équivalent à AES256. Il existe également un algorithme appelé MCRYPT_RIJNDAEL_256, mais notez que ce n'est pas le cas.

Pour le moment, il est possible de changer l'algorithme et le mode afin qu'il puisse être utilisé universellement, Je ne sais pas si cela fonctionne vraiment.

en conclusion

c'est tout! Avec cela, il est normal d'être poussé par l'envie de chiffrer AES.

Je suis content que l'OpenSSL de PHP soit très simple. (Petite sensation)

Recommended Posts

Crypter / décrypter avec AES256 en PHP et Java
Crypter avec Java et décrypter avec C #
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
Stocker dans une carte Java 2D et tourner avec pour instruction
Agrégation et analyse de journaux (utilisation d'AWS Athena en Java)
J'ai comparé les constructeurs PHP et Java
Analyse morphologique en Java avec Kuromoji
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Exemple d'encodage et de décodage en Java
Utilisez JDBC avec Java et Scala.
Implémenter la fonction PHP implode en Java
Classe StringBuffer et StringBuilder en Java
Sortie PDF et TIFF avec Java 8
Tweak Markdown avec Java flexmark-java
Bonjour tout le monde en Java et Gradle
Comparez Hello, world! Avec Spring Boot avec Java, Kotlin et Groovy
Différence entre final et immuable en Java
Surveillez les applications Java avec jolokia et hawtio
Différences d'écriture en Ruby, PHP, Java, JS
Lier le code Java et C ++ avec SWIG
Obtenez un cryptage compatible OpenSSL avec Java / PHP
Essayons WebSocket avec Java et javascript!
[Java] Lecture et écriture de fichiers avec OpenCSV
HTTPS avec Spring Boot et Let's Encrypt
Lire le fichier xlsx en Java avec Selenium
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
Diviser une chaîne avec ". (Dot)" en Java
Différence entre les listes d'arry et les listes liées en Java
Gérez d'énormes JSON avec Java Lambda
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
Soyez prudent avec les demandes et les réponses lors de l'utilisation de Serverless Framework avec Java
Concernant les modificateurs transitoires et la sérialisation en Java
Détecter des vidéos similaires dans Java et OpenCV rev.2
Créer un CSR avec des informations étendues en Java
Outil GUI refactorisé réalisé avec Java8 + JavaFX en 2016
Analyse de code statique par Checkstyle avec Java + Gradle
Traitement parallèle et parallèle dans divers langages (édition Java)
Différence entre next () et nextLine () dans Java Scanner
Créez et testez des applications Java + Gradle avec Wercker
Essayez d'intégrer Ruby et Java avec Dapr
JSON avec Java et Jackson Part 2 XSS mesures
Différences dans l'écriture des classes Java, C # et Javascript
Extraction de texte en Java à partir de PDF avec pdfbox-2.0.8
Capture et sauvegarde de l'installation de sélénium en Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Vérifier le comportement statique et public dans les méthodes Java
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Préparer un environnement de scraping avec Docker et Java
Entraînez-vous à travailler avec des paires de substitution Unicode en Java