首页 > 解决方案 > openssl_encrypt 适用于某些字符串,但不适用于其他字符串

问题描述

为什么它openssl_encrypt($plaintext, $cipher, $key, OPENSSL_NO_PADDING);在某些情况下有效而在某些情况下无效。

这是代码:

<?php
$cipher = 'AES-256-ECB';
$key = 'd61d2cd58d01b234e1800938erf8467k';
$plaintext = $entityBody;
if (strlen($plaintext) % 8) {
    $plaintext = str_pad($plaintext, strlen($plaintext) + 8 - strlen($plaintext) % 8, "\0");    
}
$chiperRaw = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_NO_PADDING);    
$ciphertext = trim(base64_encode($chiperRaw));  
?>

例如:

它对此不起作用:index12=123&date=2021-07-20&TKP=TKP&SA=SA&TPP=TPP

它适用于此:index12=123&date=2021-07-20&TKP=TKP&Snd=Snd&SA=SA&TPP=TPP

再次它不适用于此:index12=123&date=2021-07-20&TKP=TKP&Snd=Snd&GSS=GSS&SA=SA&TPP=TPP

并为此工作:index12=123&date=2021-07-20&TKP=TKP&Snd=Snd&GSS=GSS&LI=LI&SA=SA&TPP=TPP&XM=XM

如何摆脱这个问题?

标签: php

解决方案


看起来块大小应该是 16 而不是 8 字节。

if (strlen($plaintext) % 16) {
    $plaintext = str_pad($plaintext, strlen($plaintext) + 16 - strlen($plaintext) % 16, "\0");
}

推荐阅读