- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试在服务器端、PHP 和客户端上实现 mcrypt 加密/解密技术。我正在尝试使用 mcrypt.js
目前的图书馆为:
<?php
$key = 'testtesttesttesttesttesttesttest';
function string_encrypt($string, $key) {
$crypted_text = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$string,
MCRYPT_MODE_ECB
);
return base64_encode($crypted_text);
}
function string_decrypt($encrypted_string, $key) {
$decrypted_text = mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
base64_decode($encrypted_string),
MCRYPT_MODE_ECB
);
return trim($decrypted_text);
}
echo 'Provided Text: '.$test_str = 'This is test message.';
echo '<br />';
echo 'Encyrpted Value: '.$enc_str = string_encrypt($test_str, $key);
echo '<br />';
echo 'Decrypted Value: '.string_decrypt($enc_str, $key);
echo '<br />';
?>
<script src='rijndael.js'></script>
<script src='mcrypt.js'></script>
<script src='base64v1_0.js'></script>
<script lang='javascript'>
var enc_str = mcrypt.Encrypt('<?php echo $test_str ?>','');
enc_str = B64.encode(enc_str);
alert(enc_str);
// I don't get this same as encypted PHP text. i.e. $enc_str
var dec_str = B64.decode('<?php echo $enc_str ?>');
alert(mcrypt.Decrypt(dec_str,''));
// I don't get this same as decypted PHP text.
// i.e. string_decrypt($enc_str)
</script>
我在 mcrypt.js 库中使用了以下私有(private)变量。
var cMode='ecb';
var cCipher='rijndael-256';
var cKey='testtesttesttesttesttesttesttest';
//I am providing the same key
正如我上面评论的,为什么是enc_str
不等于 $enc_str
为什么是mcrypt.Decrypt('<?php echo $enc_str ?>', '')
不等于 string_decrypt($enc_str, $key)
?
更新的问题:
我尝试了 base64 编码/解码甚至 hex2bin/bin2hex 来解析这些字符串,但这两个产生了以下结果:
使用 Hex2bin/Bin2hex
PHP 结果:
Provided Text: This is test message.
Encyrpted Value: a51e970427ec8f666a5684cc1712ad03b29889cc10f4ccbf55733564d11c0386
Decrypted Value: This is test message.
JS 结果:
Provided Text:This is test message.
Mcrypted value:¥'ìfjV̲ÌôÌ¿Us5dÑ
Encyrpted Value:a51e970427ec8f666a5684cc1712ad03b29889cc10f4ccbf55733564d11c0386
After Hex to Bin Text:¥'ìfjV̲ÌôÌ¿Us5dÑ
Decrypted Value:This is test message.�����������
/*These diamond with question mark is produced while decypting the value.*/
使用 Base64 编码/解码:
PHP 结果:
Provided Text: This is test message.
Mcrypt encrypted value : ¥—'ìfjV„̲˜‰ÌôÌ¿Us5dц
/*
Here mcrypted value provided by JS and PHP is different
That is causing to produce different value at two ends
*/
Encyrpted Value: pR6XBCfsj2ZqVoTMFxKtA7KYicwQ9My/VXM1ZNEcA4Y=
Decrypted Value: This is test message.
JS 结果:
Provided Text:This is test message.
Mcrypted value:¥'ìfjV̲ÌôÌ¿Us5dÑ
Encyrpted Value:wqUewpcEJ8Oswo9malbChMOMFxLCrQPCssKYwonDjBDDtMOMwr9VczVkw5EcA8KG
After Base64 Decode:¥'ìfjV̲ÌôÌ¿Us5dÑ���
Decrypted Value:This is test message.�����������bFaêF«+JéÓ!ÆÖ
并且在这两种情况下,UTf-8 内容都无法在 JS 端解密。
*链接:*
最佳答案
主要问题似乎是您的 string_encrypt
和 string_decrypt
PHP 函数无法访问 $key
变量,因此对于加密 key mcrypt_encrypt
使用 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
。参见 this question寻求解释。 PHP 应该报告 key
未定义的通知,您是否关闭了错误报告?从加密函数中回显 key 以确认这一点。
另一个问题是 Mcrypt JS 库中的错误。如果 key 长度小于 32 字节,这个库用 \0
填充加密 key ,问题是这不是 PHP mcrypt_encrypt
功能垫键。 mcrypt_encrypt
函数将 key 填充到最接近的有效 key 长度(16、24 或 32 字节)。 mcrypt.js 中的问题在第 63 和 64 行,更改此:
if(key.length<32)
key+=Array(33-key.length).join(String.fromCharCode(0));
为此:
if(key.length<16)
key+=Array(17-key.length).join(String.fromCharCode(0));
else if(key.length<24 && key.length>16)
key+=Array(25-key.length).join(String.fromCharCode(0));
else if(key.length<32 && key.length>24)
key+=Array(33-key.length).join(String.fromCharCode(0));
现在我们可以确认修复...
PHP:
function string_encrypt($string) {
$crypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, "", $string, MCRYPT_MODE_ECB);
return $crypted_text;
}
$test_str = "This is test message to be encrypted.";
$enc_str = string_encrypt($test_str);
echo bin2hex($enc_str);
Output:
f98fca4ddc4c10d6cd47df56b081b78566ee4facbcf2254b46f7809d9b255529d2078f28b150e802d72818be1888536fac6219f6ce7b9d9332a24afa09288f0e
Javascript:
function toHex(str) {
var hex = '';
for(var i=0;i<str.length;i++) {
var val = ''+str.charCodeAt(i).toString(16);
if(val.length == 1)
hex += '0'+val;
else
hex += val;
}
return hex;
}
var enc_str = mcrypt.Encrypt("This is test message to be encrypted.", "", "", "rijndael-256", "ecb");
alert(toHex(enc_str));
Output:
f98fca4ddc4c10d6cd47df56b081b78566ee4facbcf2254b46f7809d9b255529d2078f28b150e802d72818be1888536fac6219f6ce7b9d9332a24afa09288f0e
最后,所有这些加密函数都生成二进制作为它们的输出。在大多数情况下,二进制不能在不损坏数据的情况下写成纯文本。要解决此问题,请将二进制文件编码为 Hex 或 Base64,然后在尝试解密之前对其进行解码。
所以为了让一切正常工作......
<?php
$key = 'testtesttesttesttesttesttesttest';
function string_encrypt($string, $key) {
$crypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB);
return $crypted_text;
}
function string_decrypt($encrypted_string, $key) {
$decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted_string, MCRYPT_MODE_ECB);
return trim($decrypted_text);
}
echo $test_str = 'This is test message to be encrypted.'; echo '<br />';
$enc_str = string_encrypt($test_str, $key);
echo bin2hex($enc_str); echo '<br />';
echo string_decrypt($enc_str, $key); echo '<br />';
?>
<script src='rijndael.js'></script>
<script src='mcrypt.js'></script>
<script lang='javascript'>
function toHex(str) {
var hex = '';
for(var i=0;i<str.length;i++) {
var val = ''+str.charCodeAt(i).toString(16);
if(val.length == 1)
hex += '0'+val;
else
hex += val;
}
return hex;
}
function hexToString (hex) {
var str = '';
for (var i=0; i<hex.length; i+=2) {
str += ''+String.fromCharCode(parseInt(hex.charAt(i)+hex.charAt(i+1), 16));
}
return str;
}
var enc_str = mcrypt.Encrypt('<?php echo $test_str ?>', '', 'testtesttesttesttesttesttesttest', 'rijndael-256', 'ecb');
alert(toHex(enc_str));
alert(mcrypt.Decrypt(hexToString('<?php echo bin2Hex($enc_str) ?>'), '', 'testtesttesttesttesttesttesttest', 'rijndael-256', 'ecb').replace(/\x00+$/g, ''));
</script>
一些注意事项...
修剪
string_encrypt
函数的输出。这将导致删除前导或尾随零,从而使您无法解密输出。更新:
您的 Base64 编码问题发生是因为 library you're using不适用于二进制数据。对于 Base64 javascript 库来说,这是一个相当普遍的问题。我建议使用 this library相反。
对于javascript解密时尾部的�
字符,需要修剪解密后的输出。您在 PHP string_decrypt
方法中执行此操作,但不是在您的 javascript 中执行此操作。您可以通过对字符串末尾的所有 \0
字符执行正则表达式替换来修剪解密的输出。
例子:
mcrypt.Decrypt(dec_str,'').replace(/\x00+$/g, '')
我应该在我的原始帖子中包含它,但我没有注意到输出中的 \0
字符,因为 FF 的警告框不显示它们。对此感到抱歉。
最后,我注意到 Mcrypt JS 库中的另一个错误。第 41 到 47 行:
var ciphers={ // block size, key size
"rijndael-128" :[ 16, 32],
"rijndael-192" :[ 24, 32],
"rijndael-256" :[ 32, 32],
"serpent" :[ 16, 32],
"twofish" :[ 16, 32],
}
请注意“twofish”行末尾的逗号。 Firefox 和 Chrome 似乎并不介意这一点,但 IE8 会因此报错并无法加载 mcrypt 库。要解决此问题,请更改:
"twofish" :[ 16, 32],
到:
"twofish" :[ 16, 32]
关于php - Mcrypt js 加密值不同于 PHP mcrypt/Mcrypt JS 解密生成的值不适用于 UTF-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786025/
我一直在尝试在服务器端、PHP 和客户端上实现 mcrypt 加密/解密技术。我正在尝试使用 mcrypt.js目前的图书馆为: '; echo 'Encyrpted Value: '.$enc_s
我正在尝试使用 Node 的 mycrypt 模块将旧 PHP 应用程序中的加密函数重新创建到新的 Node JS 应用程序中。 我的目标是确保在给定相同的原始字符串和盐的情况下,下面的 PHP 脚本
我需要尝试在某些示例中进行 AES 加密/解密,并且必须在我的 C 文件中使用 mcrypt.h。但是,我不知道如何安装它们。我已经从 https://sourceforge.net/projects
我有两个函数,一个用于加密和解密字符数组(变量称为:缓冲区),然后我将字符保存在文件中,以便稍后可以解密,但我注意到,如果我修改任何加密文本中的字符,mcrypt不会警告任何错误,它只是在一段文本中显
我在这门课上有一个奇怪的地方: _ch = mcrypt_module_open( $algorithm, $encLibPath, $mode, $modeDir ); $vecto
我需要在服务器端进行中度到强度的加密,所以我想我会在 PHP 中使用 mcrypt。如果我使用下面的函数,原始字符串的开头在解密后会变成二进制垃圾。 (这不是获取附加额外垃圾的常见问题,而是我的字符串
我正在尝试将加密数据写入文件。但是,当将它读回程序并尝试对其进行解密时,我只会得到垃圾。无需将其写入文件,它似乎就可以正常工作。我做错了什么? 代码如下: MCRYPT td, td2; cha
我有两个函数和一个随机生成的 key : function encode ($a) { $key = "7HLgdzXyaTaZuTss6xayLk3qLTJ2jsRLgPnMzpNwhwnE
我正在使用 C++ 代码开发 ubuntu。我想从这个链接用 mcrypt 测试一个例子:http://linux.die.net/man/3/mcrypt ,但是当我这样做时: gcc test.c
代码: function sign($data,$iv,$hexKey){ $_cipher = mcrypt_module_open(MCRYPT_RIJNDAEL
我想在 RESTful 请求中使用 header 的非对称加密来验证发送请求的系统的身份:即系统 A 在对系统 B 的请求中使用它的公钥加密它的名称、时间戳和服务名称。系统B再使用系统A的公钥解密,证
我已经尝试了所有方法,但无法修复此错误。我通过下载安装了 PHP,然后运行: brew install php55-mcrypt 我最初用 PHP 5.3 安装它,然后 Laravel 提示说它必须大
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我知道 PHP 的 mcrypt_decrypt 上已经有上百万篇文章,但我找不到与我的结果相同的文章。我有一对简单的加密/解密函数,我想用它们对数据执行双向加密。奇怪的是,对于我输入函数的任何随机字
我正在尝试安装 mcrypt 以便在我的本地机器开发环境中使用。我需要这个来安装 Magento。 我将此答案用于 install mcrypt ,但出现以下错误: $ brew link mcryp
我是这个加密的新手,所以我不太确定如何格式化我的问题。 无论如何,我正在使用名为 kohana 的框架,并且它使用三样东西进行加密: key, cipher, mode 所以我的问题是,当它编码一些字
我已经将我的 php 版本更新到 7.1。我有使用 mcrypt 加密数据的功能。现在此功能已弃用。 如何在不返回到旧版本的 php 的情况下解密数据。 这是我使用的代码: public functi
我一直在测试各种 modes在 PHP 的 mcrypt 函数中可用。 ECB 是大多数教程中使用的模式,但刚刚链接的页面和 some users 都不推荐使用该模式,所以我认为 CBC 或 CFB
我正在使用以下代码使用 mcrypt 执行加密 较新版本的 php 贬低了 mcrypt,我正在寻找使用相同 key 并产生相同结果的相同版本的替代品,因此我不需要更改客户端代码。 最佳答案 我是
我正在使用 ubuntu 13.10。我需要在我的终端上进行 mcrypt 扩展。我的服务器已经安装了它。我关注这个 question和 lunchpad . 所以我执行这个命令: sudo ln -
我是一名优秀的程序员,十分优秀!