V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
brader
V2EX  ›  程序员

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

  •  
  •   brader · 2023-05-25 11:58:28 +08:00 · 1735 次点击
    这是一个创建于 580 天前的主题,其中的信息可能已经有所发展或是发生改变。
    PHP 做 AES 加密,想用 https://phpseclib.com/docs/java 这个包,这文档里面给了一段各语言 java 解密代码示例

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

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

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

    我觉得这个网站的示例代码应该是错误的,想给作者提 issue ,因为平时接触 aes 不怎么多,大家帮忙一起看下
    16 条回复    2023-05-25 17:35:06 +08:00
    yuzo555
        1
    yuzo555  
       2023-05-25 12:06:20 +08:00
    这种 PHP 直接用自带的 openssl 库啊
    brader
        2
    brader  
    OP
       2023-05-25 12:10:34 +08:00
    @yuzo555 行是行,不过别人的扩展包,兼容性处理做的比较好,面向对象风格也比较好写
    CodeCodeStudy
        3
    CodeCodeStudy  
       2023-05-25 15:06:25 +08:00
    看不到图
    brader
        4
    brader  
    OP
       2023-05-25 15:11:34 +08:00
    @CodeCodeStudy 不可能吧,你都能翻到这个网站,imgur.com 上的图片应该看得到呀
    wudicgi
        5
    wudicgi  
       2023-05-25 15:14:13 +08:00
    if ($length % $this->block_size == 0) {
    return $text;
    }

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

    https://qy.baidu.com/doc/index.html#/inner_serverapi/appendix
    sincus
        14
    sincus  
       2023-05-25 16:27:30 +08:00
    @brader 确实,我也看不到图
    YepTen
        15
    YepTen  
       2023-05-25 17:34:22 +08:00
    Java Security Standard Algorithm Names
    中对加密的填充模式只有以下几种:
    NoPadding
    ISO10126Padding
    OAEPPadding, OAEPWith<digest>And<mgf>Padding
    PKCS1Padding
    PKCS5Padding
    SSL3Padding
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:36 · PVG 01:36 · LAX 09:36 · JFK 12:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.