帮忙看个 PHP 和 Java 关于 AES-128-CBC 加解密的代码

339 天前
 brader
PHP 做 AES 加密,想用 https://phpseclib.com/docs/java 这个包,这文档里面给了一段各语言 java 解密代码示例

上面 java 示例代码解密使用的填充模式是 PKCS#5

下面是 PHP 扩展包源码中找到的填充模式源码

据我观察,这个填充模式应该是 PKCS#7

我觉得这个网站的示例代码应该是错误的,想给作者提 issue ,因为平时接触 aes 不怎么多,大家帮忙一起看下
1460 次点击
所在节点    程序员
16 条回复
yuzo555
339 天前
这种 PHP 直接用自带的 openssl 库啊
brader
339 天前
@yuzo555 行是行,不过别人的扩展包,兼容性处理做的比较好,面向对象风格也比较好写
CodeCodeStudy
339 天前
看不到图
brader
339 天前
@CodeCodeStudy 不可能吧,你都能翻到这个网站,imgur.com 上的图片应该看得到呀
wudicgi
339 天前
if ($length % $this->block_size == 0) {
return $text;
}

看着不是 PKCS7, PKCS7 任何时候都要加 padding 的
如果 block_size 是 8 bytes, 那么长度恰好是 8 的整倍数时,要填充 8 个 0x08
wudicgi
339 天前
呃,我漏看了 if ($this->padding) { 了
那看着是 PKCS7
Great233
339 天前
PKCS#5 填充不能用于 AES 加密,看说是 Java 加密库历史遗留问题,所以在使用 AES 加密的时候写的是 PKCS5Padding ,实际是 PKCS7Padding
> https://crypto.stackexchange.com/a/9044
brader
339 天前
@Great233 按我找到的相关 AES 资料,我的认知也是 PKCS#5 填充不能在 AES 加密的 CBC 模式使用,因为 AES 的 CBC 模式,最短的块长度是 16 ,而 PKCS#5 适用于块长度为 8 。关于 java 方面等问题,我就不是很清楚了,毕竟不是做 java 开发
wudicgi
339 天前
PKCS5 和 PCKS7 padding 的区别是它只能用于 block size 为 8 bytes 的情况
PKCS7 的 block size 可以到 255 bytes
brader
339 天前
@wudicgi 嗯,所以上面代码应该就是使用的 PKCS7 了,因为是动态填充的,那 java 示例应该是有问题的,除非像楼上有个同学说的,java 这样写是历史遗留问题
CodeCodeStudy
339 天前
@brader #4 http 错误为 429 Too Many Requests
brader
339 天前
@CodeCodeStudy 那就不知道为啥你被针对了,大家都看得到,而且这个图床,V2 最多人用的了
iyaozhen
339 天前
看下这个,我很久之前做的,各个语言 AES 加密,重点是能互通的

https://qy.baidu.com/doc/index.html#/inner_serverapi/appendix
sincus
339 天前
@brader 确实,我也看不到图
YepTen
339 天前
Java Security Standard Algorithm Names
中对加密的填充模式只有以下几种:
NoPadding
ISO10126Padding
OAEPPadding, OAEPWith<digest>And<mgf>Padding
PKCS1Padding
PKCS5Padding
SSL3Padding
YepTen
339 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/942827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX