【问题标题】:Remove Special character when decrypt by editing encrypt string通过编辑加密字符串解密时删除特殊字符
【发布时间】:2016-04-22 03:50:10
【问题描述】:
$secretKey = "MYSECRETKEY"; 

$plaintext = 'Plain Text Will Be here';

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  

$ivDecode = base64_encode(mcrypt_create_iv($iv_size, MCRYPT_RAND));

$encrypted = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
                            substr(sha1($secretKey), 0, 32),
                             $plaintext, 
                             MCRYPT_MODE_CBC, 
                             $iv), "\0..\32");

$encrypted = $iv . $encrypted;

$ciphertext_base64 = base64_encode($encrypted);

#echo  $ciphertext_base64 . "\n"; 
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
                             substr(sha1($secretKey), 0, 32),
                             base64_decode($ciphertext_base64),
                             MCRYPT_MODE_CBC,
                             base64_decode($ivDecode)), "\0..\32");

echo $decrypted;

当我运行上面的代码时,我得到了这个输出。

»_w>ø9â„6ÅkžPlain Text Will Be here

我无法编辑$decrypted 字符串,因为我无法访问它。我只能编辑 $encrypted 。那么如何通过编辑$encrypted 字符串从输出中删除额外的特殊字符(»_w>ø9â„6Åkž)。我想使用 JSON 将加密文本发送到不同的服务器进行解密。

【问题讨论】:

  • 我尝试清除 cookie 但它不起作用。 :)
  • mcrypt_ 切换到openssl_ 将使您的生活更轻松。
  • @ScottArciszewski 你用openssl_测试了上面的例子吗?它不能解决问题。问题仍未解决。您可以添加工作示例吗?

标签: php encryption mcrypt


【解决方案1】:

无法在Base64解码之前拆分iv和加密数据,首先Base64解码然后拆分它们。

  1. MCRYPT_RIJNDAEL_128 也是 AES,其块大小为 128 位或 16 字节。 iv必须是那个大小。而不是包含base64_decode($iv) 作为参数实际上是创建一个 16 字节的 iv。如果 iv 不是 Base64 编码的,Base64 解码将不起作用,在这种情况下不是。

  2. 密钥应该是 128、192 或 256 位(16、24 或 32 字节),正好是互操作性的正确大小,不要依赖加密算法的填充。

  3. 同样,要加密的输入和密钥在单独的语句中准备好,以便更容易调试。

  4. 不要修剪输出,mcrypt_decrypt 是正确的。填充可能会添加额外的块,这是必需的。

  5. 不要对解密结果进行 Base64 解码,明文不是 Base64 编码的。 – zaph 刚刚编辑

“像这样的文本 ïÕ[pI¤;Køv” 可能在尝试将数据打印为字符串时出现,并非所有二进制字节都有打印表示,并且许多具有特殊字符作为 0x80-0xff 范围内的打印表示。

这是概念,未经测试,我已经 20 年没有使用 php 了,所以修复任何错误:

$secretKey = "1234567890123456"; # Note the length is 16-bytes, a full key
$plaintext = 'XXXXXXXXX';
echo  $plaintext . "\n";

# --- ENCRYPTION ---
$key = substr(sha1($secretKey), 0, 32)
$iv = mcrypt_create_iv(16, MCRYPT_RAND);  
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
                             $key,
                             $plaintext, 
                             MCRYPT_MODE_CBC, 
                             $iv);
# prepend the IV for it to be available for decryption
$ciphertext = $iv . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
echo  $ciphertext_base64 . "\n";

# --- DECRYPTION ---
$key = substr(sha1($secretKey), 0, 32)
$cipher_text_iv = base64_decode($ciphertext_base64)
# split the iv and encrypted text
$iv = substr($cipher_text_iv, 0, 16)
$ciphertext = substr($cipher_text_iv, 16)

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
                             $key,
                             $ciphertext,
                             MCRYPT_MODE_CBC,
                             $iv);
echo $decrypted;

【讨论】:

  • Zaph.. 我可以删除警告,但解密时我仍然会收到特殊字符。我只能编辑加密。解密来自第 3 方。您对删除这些特殊字符有什么建议吗?
  • 你不能在 Base64 解码之前拆分 iv 和加密数据,首先 Base64 解码然后拆分它们,正如我所说,不要在解密调用中这样做,这使得调试非常困难。组合步骤只会让事情变得更难理解。
  • 解密结果也不用Base64解码,明文没有经过Base64编码。
  • zaph 我不明白你。您可以添加示例进行加密吗?
  • 我加了一个例子,可能有php错误,我20年没用过php了。
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多