php - 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
如何摆脱这个问题?
解决方案
看起来块大小应该是 16 而不是 8 字节。
if (strlen($plaintext) % 16) {
$plaintext = str_pad($plaintext, strlen($plaintext) + 16 - strlen($plaintext) % 16, "\0");
}
推荐阅读
- python - Tfidftransformer 和 Tfidfvectorizer 有什么区别?
- javascript - Selenium 在下拉列表中访问多个影子 dom 元素?
- reactjs - 如何使用 Firebase Auth API 发送电子邮件验证并在登录前检查用户是否经过验证
- javascript - 在选项中动态添加项目
- django - 将查询集的子集附加到同一查询集(不是逻辑联合)
- json - 如何在颤动中从 JSON 中提取列表?
- php - 上传 CSV 文件如何删除多余的空格
- python - 运行“诗歌运行”命令时出现 PermissionError
- javascript - 使用 Intersection Observer 在向上滚动时显示粘性 div
- mysql - 如何使用 Spring JPA 从数据库中获取有限的记录?