java - decrypt - desencriptar password postgresql
Encriptación AES 128 en Java Decryption en PHP (1)
He intentado descifrar una cadena usando AES-128 CBC, que originalmente se encriptaba utilizando el cifrado JAVA AES. En java se usa el relleno PKCS7. Y he intentado cifrar y descifrar usando un código PHP similar. Pero estoy obteniendo resultados diferentes.
Mi código Java
import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.util.Base64;
/**
* @author vipin.cb , [email protected] <br>
* Sep 27, 2013, 5:18:34 PM <br>
* Package:- <b>com.veebow.util</b> <br>
* Project:- <b>Veebow</b>
* <p>
*/
public class AESCrypt {
private final Cipher cipher;
private final SecretKeySpec key;
private AlgorithmParameterSpec spec;
public static final String SEED_16_CHARACTER = "U1MjU1M0FDOUZ.Qz";
public AESCrypt() throws Exception {
// hash password with SHA-256 and crop the output to 128-bit for key
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(SEED_16_CHARACTER.getBytes("UTF-8"));
byte[] keyBytes = new byte[32];
System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
key = new SecretKeySpec(keyBytes, "AES");
spec = getIV();
}
public AlgorithmParameterSpec getIV() {
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
IvParameterSpec ivParameterSpec;
ivParameterSpec = new IvParameterSpec(iv);
return ivParameterSpec;
}
public String encrypt(String plainText) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
String encryptedText = new String(Base64.encode(encrypted,
Base64.DEFAULT), "UTF-8");
return encryptedText;
}
public String decrypt(String cryptedText) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, key, spec);
byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT);
byte[] decrypted = cipher.doFinal(bytes);
String decryptedText = new String(decrypted, "UTF-8");
return decryptedText;
}
}
Y el código PHP equivalente que estoy usando.
<?php
class MCrypt {
private $iv = ''0000000000000000''; #Same as in JAVA
private $key = ''U1MjU1M0FDOUZ.Qz''; #Same as in JAVA
function __construct() {
$this->key = hash(''sha256'', $this->key, true);
}
function encrypt($str) {
$iv = $this->iv;
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '''', MCRYPT_MODE_CBC, '''');
mcrypt_generic_init($td, $this->key, $iv);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
$encrypted = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return base64_encode($encrypted);
}
function decrypt($code) {
$iv = $this->iv;
$td = mcrypt_module_open(''rijndael-128'', '''', ''cbc'', '''');
mcrypt_generic_init($td, $this->key, $iv);
$str = mdecrypt_generic($td, base64_decode($code));
$block = mcrypt_get_block_size(''rijndael-128'', ''cbc'');
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $str;
//return $this->strippadding($str);
}
/*
For PKCS7 padding
*/
private function addpadding($string, $blocksize = 16) {
$len = strlen($string);
$pad = $blocksize - ($len % $blocksize);
$string .= str_repeat(chr($pad), $pad);
return $string;
}
private function strippadding($string) {
$slast = ord(substr($string, -1));
$slastc = chr($slast);
$pcheck = substr($string, -$slast);
if (preg_match("/$slastc{" . $slast . "}/", $string)) {
$string = substr($string, 0, strlen($string) - $slast);
return $string;
} else {
return false;
}
}
}
$encryption = new MCrypt();
echo $encryption->encrypt(''123456'') . "<br/>";
echo $encryption->decrypt(''tpyxISJ83dqEs3uw8bN/+w=='');
En Java
Texto sin formato = 123456
Cipher text = tpyxISJ83dqEs3uw8bN / + w ==
En PHP
Texto sin formato = 123456
Cipher text = IErqfTCktrnmWndOpq3pnQ ==
Cuando traté de cribar el texto encriptado de Java "tpyxISJ83dqEs3uw8bN / + w ==" usando el descifrado de PHP, obtengo una matriz vacía si eliminé el relleno. Sin quitar el relleno, recibo "::::::::::"
Creo que hay algún error con los IV bytes utilizados en PHP y Java. ¿Alguien puede ayudarme en esto? He intentado muchas combinaciones. Aún no hay resultados Soy muy nuevo en los conceptos de Java.
------Solución-------
Modifiqué mi clase php según los comentarios de owlstead. puede haber una mejor manera. Lo publico aquí para que alguien lo encuentre útil en el futuro y sus comentarios son bienvenidos para una mejoría adicional.
<?php
class MCrypt {
private $hex_iv = ''00000000000000000000000000000000''; # converted Java byte code in to HEX and placed it here
private $key = ''U1MjU1M0FDOUZ.Qz''; #Same as in JAVA
function __construct() {
$this->key = hash(''sha256'', $this->key, true);
//echo $this->key.''<br/>'';
}
function encrypt($str) {
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '''', MCRYPT_MODE_CBC, '''');
mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
$encrypted = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return base64_encode($encrypted);
}
function decrypt($code) {
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '''', MCRYPT_MODE_CBC, '''');
mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
$str = mdecrypt_generic($td, base64_decode($code));
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $this->strippadding($str);
}
/*
For PKCS7 padding
*/
private function addpadding($string, $blocksize = 16) {
$len = strlen($string);
$pad = $blocksize - ($len % $blocksize);
$string .= str_repeat(chr($pad), $pad);
return $string;
}
private function strippadding($string) {
$slast = ord(substr($string, -1));
$slastc = chr($slast);
$pcheck = substr($string, -$slast);
if (preg_match("/$slastc{" . $slast . "}/", $string)) {
$string = substr($string, 0, strlen($string) - $slast);
return $string;
} else {
return false;
}
}
function hexToStr($hex)
{
$string='''';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
}
$encryption = new MCrypt();
echo $encryption->encrypt(''123456'') . "<br/>";
echo $encryption->decrypt(''tpyxISJ83dqEs3uw8bN/+w=='');
Su IV es diferente, un byte con valor cero es diferente de un carácter ''0''
que se traduciría en un byte con el valor 30
en hexadecimales o 48 en decimales (si se supone que codifica ASCII o UTF-8).