...
<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;
}
}
? >