gpt4 book ai didi

Javascript DES加密/PHP解密

转载 作者:搜寻专家 更新时间:2023-10-31 21:35:19 24 4
gpt4 key购买 nike

我有一个被多个网站使用的 PHP 端点。在将数据发布到端点时,站点使用加密的 header 来识别各种信息。这些站点使用标准的 PHP mcrypt_ecb 函数,端点像这样解密变量:

$var = trim(mcrypt_ecb(MCRYPT_DES, $key, base64_decode($input), MCRYPT_DECRYPT)));

我真的没有太多机会改变 PHP 端点,尽管如果 mcrypt_ecb 不能很好地运行,我可以想象创建另一个端点。

我现在有一个 PhoneGap 应用程序,它也需要发送加密的 header 。 Phonegap 只能真正使用 javascript 来 POST 到远程服务器。我看过 Google CryptoJS为了实现这一目标,需要一个 base64 库。请注意, key 与上面的 $key var 相同。

var encrypted = CryptoJS.DES.encrypt(user.email, key).toString();
var base64 = base64.encode(encrypted);

问题是通过 mcrypt_ecb 传递的加密字符串(我已经尝试过不使用 base64 编码/解码)是垃圾。显然有不同的三重 DES 加密方法?

我如何在 JavaScript 中创建一个 mcrypt_ecb 兼容的加密字符串?

最佳答案

根据: http://php.net/manual/en/function.mcrypt-decrypt.php

Warning This function (mcrypt-decrypt) has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.

然后我不得不进行大量调查,直到我发现一种通过 javascript 使用 openssl 加密并使用 php 解密的方法。

我遇到的唯一问题是发送长文本时。这是因为根据定义,RSA 支持有限长度的字符串。

https://security.stackexchange.com/questions/33434/rsa-maximum-bytes-to-encrypt-comparison-to-aes-in-terms-of-security/33445#33445

RSA, as defined by PKCS#1, encrypts "messages" of limited size. With the commonly used "v1.5 padding" and a 2048-bit RSA key, the maximum size of data which can be encrypted with RSA is 245 bytes. No more.

即如果我使用 1024 的 private_key_bits 我可以发送

"José compró en Perú una vieja zampoña. Excusándose, Sofía tiró su whisky al desagüe de la banqueta."

没有了。如果我使用 512 的 private_key_bits 我可以发送

"José compró en Perú una vieja zampoña. Excusánd"

没有了。

关于长字符串 JavaScript 控制台报告:“消息对于 RSA 而言太长”

然后,如果你想加密长字符串,你必须在 javascript 加密之前压缩和拆分它们,解密之后在 php 上连接和解压缩,我认为 zlib 是拆分/连接的一个很好的解决方案,因为它在 javascript 和 php 上受支持。

也许最好使用 AES 库而不是像 https://github.com/brainfoolong/cryptojs-aes-php 这样的库

我的工作代码如下:

<?php
//------------------------------------------------------------
// Global Settings.
//------------------------------------------------------------
ini_set('display_errors', 1);
error_reporting(E_ALL);
$directorio = "/path/to/key/directory/apache/writable/";
$nombre_base = "llaves_php";

//------------------------------------------------------------
// Initialization.
//------------------------------------------------------------
$encabezado_html = "";
$cuerpo_html = "";

//------------------------------------------------------------
// Loading keys
//------------------------------------------------------------
list($privateKey, $pubKey) =
cargar_llaves_RSA($directorio, $nombre_base);

//------------------------------------------------------------
// Form that uses javascript to encrypt data.
// (it uses only the public key)
//------------------------------------------------------------
$librerias_html = "
<script type='text/javascript'
src='https://ajax.googleapis.com/ajax/libs/".
"jquery/3.2.1/jquery.min.js'></script>
<script type='text/javascript'
src='lib/jsencrypt.js'></script>
";

$pubKey_html = htmlentities($pubKey);
$datos_html = "
<h2>Cifrando con Javascript</h2>
<input type='text' id='mensaje' />
<br />
<button id='ENVIAR'>Enviar</button>
<br />
<textarea id='pubkey' style='display: none;'>".
$pubKey_html.
"</textarea>
<script type='text/javascript'>
$('#ENVIAR').click(function () {
var codificador = new JSEncrypt();
codificador.setKey($('#pubkey').val());
var cifrado = codificador.encrypt($('#mensaje').val());
window.open('?mensaje=' + encodeURIComponent(cifrado)
, '_top');
});
</script>
";

//------------------------------------------------------------
// Decrypting using php (it uses only the privateKey)
//------------------------------------------------------------
if (isset($_REQUEST['mensaje'])) {
openssl_private_decrypt( base64_decode($_REQUEST['mensaje'])
, $descifrado
, $privateKey);
$datos_html.= "
<h2>Descifrando con PHP</h2>
".$descifrado."
";
}

//------------------------------------------------------------
// HTML DISPLAY
//------------------------------------------------------------
$encabezado_html.= "<title>Receptor de mensaje cifrado</title>"
. $librerias_html;

$cuerpo_html.= $datos_html;

$contenido = "<head>$encabezado_html</head><body>$cuerpo_html</body>";
$contenido = "<html>$contenido</html>";
print $contenido;

//============================================================
//============================================================
// Functions
//============================================================
//============================================================

//------------------------------------------------------------
function cargar_llaves_RSA($directorio, $nombre_base) {
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// PROPÓSITO: Genera o carga desde archivos las llaves RSA
// ENTRADAS:
// $directorio: Directorio donde se encuentran los archivos.
// $nombre_base: Nombre, sin extensión, de los archivos con
// las llaves.
// SALIDAS:
//------------------------------------------------------------
if ( !file_exists($directorio.$nombre_base.".crt")
|| !file_exists($directorio.$nombre_base.".pub")) {
list($privateKey, $pubKey) = crear_llaves_RSA($directorio.$nombre_base);
} else {
//------------------------------------------------------------
// CARGA DE LLAVES RSA ARCHIVADAS
//------------------------------------------------------------
$privateKey = file_get_contents($directorio.$nombre_base.".crt");
if (!$privKey = openssl_pkey_get_private($privateKey))
die('Loading Private Key failed');
$pubKey = file_get_contents($directorio.$nombre_base.".pub");
}

return array($privateKey, $pubKey);
}

//------------------------------------------------------------
function crear_llaves_RSA($ruta_base) {
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// PROPÓSITO:
// generacion de llaves RSA en php
// ENTRADAS:
// $ruta_base: Ruta de los archivos a generar sin extensión.
// SALIDAS:
// Se generarán dos archivos, uno con la llave privada con
// extensión .crt, el otro con llave pública con extensión
// .pub; la función retorna tanto la llave pública como la
// privada en un arreglo.
//------------------------------------------------------------
$config = array(
"private_key_bits" => 1024,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);

$llavePrivadaCruda = openssl_pkey_new($config);
openssl_pkey_export_to_file($llavePrivadaCruda, $ruta_base.".crt");
$privateKey = file_get_contents($ruta_base.".crt");
openssl_pkey_export($llavePrivadaCruda, $privKey);

$pubKeyData = openssl_pkey_get_details($llavePrivadaCruda);
$pubKey = $pubKeyData["key"];
file_put_contents($ruta_base.".pub", $pubKey);
openssl_free_key($llavePrivadaCruda);

return array($privateKey, $pubKey);
}

//------------------------------------------------------------
function Mostrar($valor) {
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// PROPÓSITO: Genera el código HTML para presentar una
// variable embebida en la página.
// ENTRADAS:
// $valor: el valor a presentar.
// SALIDAS: código html que permite visualizar la variable.
//------------------------------------------------------------
$retorno = htmlentities(stripslashes(var_export($valor, true)));
$retorno = "<pre>$retorno</pre>";
return $retorno;
}

?>

目录树必须如下所示:

├── script.php
└── lib
└── jsencrypt.js

和一个名为 php 的公共(public)区域之外的可写目录

/path/to/key/directory/apache/writable/

关于Javascript DES加密/PHP解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21520637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com