MD5

Mensaje

Resultado
						
						 < ?
						 $valor=md5(trim($_POST["nombreControl"]));
						 ? >
						
					 

AES 256 GCM

Key
Ejemplo: KX308STDTHPX6RHGE5RYXOAG8NKJXTC4
IV
Ejemplo: KS0RKEVOXLCNQHNZ
Mensaje
Ejemplo: Indiana jones was here
Modo

Resultado
						
						 < ?
						   $cipher = 'aes-256-gcm';
						   $tag_length = 16;
						   $tag="";	 
						   
						   if($valorModo == "1")
							{
								//encriptar
								$ciphertext = openssl_encrypt($valorMensaje, $cipher, $valorKey, OPENSSL_RAW_DATA, $valorIV, $tag, "", $tag_length);
								$r_aes = base64_encode($valorIV.$ciphertext.$tag);
							}
						   else
							{
								//desencriptar
								$textToDecrypt = $valorMensaje;
								$encrypted = base64_decode($textToDecrypt);
								$iv_len = strlen($valorIV);
								$iv = substr($encrypted, 0, $iv_len);
								$tag = substr($encrypted, -$tag_length);
								$encrypted = substr($encrypted, $iv_len, -$tag_length);
								$r_aes = openssl_decrypt($encrypted, $cipher, $valorKey, OPENSSL_RAW_DATA, $iv, $tag);
							}	   
						 ? >
						
					 

JSON Web Encryption (JWE) with AES 256 GCM | Jose JS

Key
Ejemplo: KX308STDTHPX6RHGE5RYXOAG8NKJXTC4
IV
Ejemplo: KS0RKEVOXLCNQHNZ
Mensaje
Ejemplo: {"entityCode":"1000000001"}
Modo

Resultado
						
						   ...
						   <script src="dist/jose.js"></script>
						   <script src="dist/jwe.js"></script>						   
						   ... 		
						   <!-- Delete in the name and the id control the character _ -->
						   <form name="formularioPSE_"   method="POST" onsubmit="return procesoCreateTransactionPaymentNF()" >				  
						   <div class="row" style="margin-top:5px;">
							<div class="col-md-2" >
							   Key
							</div>
							<div class="col-md-10" >
							   <input type="text" name="valorKey2_" id="valorKey2_" value="" placeholder="Key" class="form-control" onchange="configurarKeyBase64Url()" required>
							   <input type="hidden" name="keyBase64Url_" id="keyBase64Url_" value="">
							   <font style="font-size:10px;">Ejemplo: KX308STDTHPX6RHGE5RYXOAG8NKJXTC4</font>
							</div>
						   </div>
						   <div class="row" style="margin-top:5px;">
							<div class="col-md-2" >
							   IV
							</div>
							<div class="col-md-10" >
							   <input type="text" name="valorIV2_" id="valorIV2_" value="" placeholder="IV (initialization vector)" class="form-control" required>
							   <font style="font-size:10px;">Ejemplo: KS0RKEVOXLCNQHNZ</font>
							</div>
						   </div>
						   <div class="row" style="margin-top:5px;">
							<div class="col-md-2" >
							   Mensaje
							</div>
							<div class="col-md-10" >
							   <textarea name="valorMensaje2_" id="valorMensaje2_" rows="4" class="form-control" required></textarea>
							   <font style="font-size:10px;">Ejemplo: {"entityCode":"1000000001"}</font>
							</div>
						   </div>
						   <div class="row" style="margin-top:5px;">
							<div class="col-md-2" >
							   Modo
							</div>
							<div class="col-md-10" >
							  <select name="valorModo2_" id="valorModo2_" class="form-control">
							   <option value="1" <? if($valorModo=="1"){ ?>selected<? } ?> >Encriptar</option>
							   <option value="2" <? if($valorModo=="2"){ ?>selected<? } ?> >Desencriptar</option>
							  </select>
							</div>
						   </div>
						   <div class="row" style="margin-top:5px;">
							<div class="col-md-12" >
							  <input type="submit" class="btn btn-success pull-right"  value="Enviar">  
							</div>
						   </div>
						   <div class="row">
							<div class="col-md-12" >
							  <div id="jweResult_"></div>
							</div>
						   </div>
						   </form>
						
					 
						
							/*
							jwe.js | JWE interaction JS
							*/

							/* encriptarJWE  */
							function encriptarJWE(texto,targetOperation,filtro='')
							{
							const cryptographer = new Jose.WebCryptographer();
							cryptographer.setKeyEncryptionAlgorithm('dir');
							let algJWE="A256GCM";

							const sharedJwk = { 'alg': algJWE,   'ext': true,'k': document.getElementById("keyBase64Url").value, 'key_ops': ['encrypt', 'decrypt'], 'kty': 'oct' };
							const plaintext2 =texto;
							let sharedKey;

							var roundtrip = crypto.subtle.importKey('jwk', sharedJwk, { name: 'AES-GCM'}, true, ['encrypt', 'decrypt'])
							.then(function (key) {
								  sharedKey = key;
								  var encrypter = new Jose.JoseJWE.Encrypter(cryptographer, sharedKey);
								  const r=encrypter.encrypt(plaintext2);
								  return r;
								})
								.then(function (ciphertext) {
								  
								  $("#jweResult").text(ciphertext);
								  return ciphertext;
								});
								
								return 1;
							}

							/* configurarKeyBase64Url */
							function configurarKeyBase64Url()
							{
							 $.ajax({
												url: 'https://comunicatte.com.co/ajaxoperaciones.php',
												type: 'post',
												data: {
														getKeyBase64URL:1,
														token:document.getElementById("valorKey2").value
												},
												dataType: 'json',
												success:function(response)
												{
													document.getElementById("keyBase64Url").value=response[0].contenido;
												} 
							 });
							}

							/* desencriptarJWE  */
							function desencriptarJWE(jwe,targetOperation,filtro='')
							{
							let sharedKey2;
							const cryptographer = new Jose.WebCryptographer();
							cryptographer.setKeyEncryptionAlgorithm('dir');
							let algJWE="A256GCM";
							const sharedJwk = { 'alg': algJWE,   'ext': true,'k': document.getElementById("keyBase64Url").value, 'key_ops': ['encrypt', 'decrypt'], 'kty': 'oct' };
							var roundtrip = crypto.subtle.importKey('jwk', sharedJwk, { name: 'AES-GCM'}, true, ['encrypt', 'decrypt'])
							.then(function (key) {
								  sharedKey2 = key;
								  let ciphertext=jwe;
								  var decrypter = new Jose.JoseJWE.Decrypter(cryptographer, sharedKey2);
								  const rc=decrypter.decrypt(ciphertext);
								  return rc;
								})
								.then(function (ciphertext) {
									 $.ajax({
														url: 'https://comunicatte.com.co/ajaxoperaciones.php',
														type: 'post',
														data: {
																desencriptarAes256GCM:1,
																cipher:'aes-256-gcm',
																tag_length:'16',
																tag:'',
																key:document.formularioPSE.valorKey2.value,
																iv:document.formularioPSE.valorIV2.value,
																token:ciphertext
														},
														dataType: 'json',
														success:function(response)
														{
															$("#jweResult").text(response[0].contenido);
														} 
									 });
								});
							}



							/* procesoCreateTransactionPaymentNF */
							function procesoCreateTransactionPaymentNF()
							{
							 $("#jweResult").text(""); 	
							 
							 if(document.formularioPSE.valorKey2.value == "")
							  {
								 alert("Por favor ingresar el KEY");
								 return false;   
							  }
							 if(document.formularioPSE.valorIV2.value == "")
							  {
								 alert("Por favor ingresar el IV");
								 return false;   
							  }
							 if(document.formularioPSE.valorMensaje2.value == "")
							  {
								 alert("Por favor ingresar el mensaje");
								 return false;   
							  }
							  
							 configProcessPSE();
							 
							 return false;    
							}

							//enviar solicitud 
							function configProcessPSE()
							{
							 var mensajeJson=document.formularioPSE.valorMensaje2.value;
							 let data =  mensajeJson;
							 let modo=document.formularioPSE.valorModo2.value;
							 
							 if(modo == "1")
							  {
								//encriptar
								encriptarAES256GCM(data,modo); //targetOperation 1 encriptar | 2 desencriptar
							  }
							 else
							  {
								//desencriptar  
								desencriptarJWE(data,modo);
							  }
							}

							/* encriptarAes256GCM */
							function encriptarAES256GCM(dataInfo,targetOperation)
							{
							 $.ajax({
												url: 'https://comunicatte.com.co/ajaxoperaciones.php',
												type: 'post',
												data: {
														encriptarAes256GCM:1,
														token:dataInfo,
														cipher:'aes-256-gcm',
														tag_length:'16',
														tag:'',
														key:document.formularioPSE.valorKey2.value,
														iv:document.formularioPSE.valorIV2.value
												},
												dataType: 'json',
												success:function(response)
												{
												  //encriptar JWE 
												  encriptarJWE(response[0].contenido,targetOperation);
												} 
							 });
							}
						
					 
						
							< ? php 
							/*
							ajaxoperaciones.php
							*/
							include("clases/logica.php");
							header('Access-Control-Allow-Origin: *');
							header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
							header('Access-Control-Allow-Methods:   POST');

							extract($_POST);
							extract($_GET);

							//objeto logica
							$objetoLogica=new logica();

							//encriptarAes256GCM
							if(isset($encriptarAes256GCM) && isset($token))
							 {
								$resp=$objetoLogica->encriptarAes256GCM($token,$cipher,$tag_length,$tag,$key,$iv);

								//response
								$resultado_arr[] = array("mensaje" => "Encriptar", "contenido" => $resp); 
								echo json_encode($resultado_arr);	
							 }

							//desencriptarAes256GCM
							if(isset($desencriptarAes256GCM) && isset($token))
							 {
								$resp=$objetoLogica->desencriptarAes256GCM($token,$cipher,$tag_length,$tag,$key,$iv);

								//response
								$resultado_arr[] = array("mensaje" => "Desencriptar", "contenido" => $resp); 
								echo json_encode($resultado_arr);	
							 }
							  
							//getKeyBase64URL
							if(isset($getKeyBase64URL) && isset($token))
							 {
								$key=$token;
								$keyBase64Url=base64_encode($key);
								$keyBase64Url= strtr($keyBase64Url, '+/', '-_');
								$keyBase64Url=rtrim($keyBase64Url, '=');

								//response
								$resultado_arr[] = array("mensaje" => "base64URL", "contenido" => $keyBase64Url); 
								echo json_encode($resultado_arr);	
							 }
							  
							? >						  
						
					 
						
							< ?
							/*
							logica.php
							*/
							class logica
							{

							/*
							constructor
							*/
							public function __construct()
							{ 
							}

							/*
							encriptarAes256GCM
							*/
							public function encriptarAes256GCM($plaintext,$cipher,$tag_length,$tag,$key,$iv)
							{
							$ciphertext = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag, "", $tag_length);
							$encrypted = base64_encode($iv.$ciphertext.$tag);
							return $encrypted;    
							}

							/*
							desencriptarAes256GCM
							*/
							public function desencriptarAes256GCM($plaintext,$cipher,$tag_length,$tag,$key,$iv)
							{
							$textToDecrypt = $plaintext;
							$encrypted = base64_decode($textToDecrypt);
							$iv_len = strlen($iv);
							$iv = substr($encrypted, 0, $iv_len);
							$tag = substr($encrypted, -$tag_length);
							$encrypted = substr($encrypted, $iv_len, -$tag_length);
							$decrypted = openssl_decrypt($encrypted, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag);
							return $decrypted;    
							}

							}
							? >