当前位置: 首页 > article >正文

PHP实现DESede/ECB/PKCS5Padding加密算法兼容Java SHA1PRNG

这里写自定义目录标题

  • 背景
  • JAVA代码
  • 解决思路
    • PHP解密

背景

公司PHP开发对接一个Java项目接口,接口返回数据有用DESede/ECB/PKCS5Padding加密,并且key也使用了SHA1PRNG加密了,网上找了各种办法都不能解密,耗了一两天的时间,一度怀疑人生……

JAVA代码

public class DESUtil {

    private static final String KEY_ALGORITHM = "DESede";
    private static final String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";

    /* DES加密 */
    public static String encrypt(String content, final String key) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            byte[] byteContent = content.getBytes(StandardCharsets.UTF_8.name());
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
            byte[] result = cipher.doFinal(byteContent);
            return Base64.encodeBase64String(result);
        } catch (Exception ex) {
            log.error("【DES加密失败】:", ex);
        }
        return null;
    }

    /* DES解密 */
    public static String decrypt(String content, final String key) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
            byte[] result = cipher.doFinal(Base64.decodeBase64(content));
            return new String(result, StandardCharsets.UTF_8.name());
        } catch (Exception ex) {
            log.error("【DES解密失败】:", ex);
        }
        return null;
    }
    
    public static SecretKeySpec getSecretKey(final String key) {
        KeyGenerator kg = null;
        try {
            kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(key.getBytes(StandardCharsets.UTF_8.name()));
            kg.init(secureRandom);
            SecretKey secretKey = kg.generateKey();
            return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
        } catch (NoSuchAlgorithmException ex) {
            log.error("【DES生成秘钥失败】:", ex);
        } catch (UnsupportedEncodingException e) {
            log.error("【DES生成秘钥失败】:", e);
        }
        return null;
    }
}

解决思路

终于找到了一个类似问题,可是要会员才能看,作为一名穷DS,哪有这么富有,灵机一动在某鱼花了1大洋看了解决思路,果然是金钱的力量,功夫不负有心人啊,终于寻到stackoverflow有个类似问题。

在这里插入图片描述

上面Java代码中的secretKey变量的比特值,使用Base64Utils.encode后得到base64字符串
然后在php中使用base64_decode解码串,得到密钥key

PHP解密

/* 3DES解密 */
    public function desDecrypt($content) {
        $key=$this->config['desKey'];
        $key=base64_decode($key);
        $content = base64_decode($content);
        // 解密数据
        $plaintext = openssl_decrypt($content, 'DES-EDE3', $key, OPENSSL_RAW_DATA);
        return $plaintext;
    }

http://www.kler.cn/a/229643.html

相关文章:

  • Elasticsearch:使用 Playground 与你的 PDF 聊天
  • Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用
  • 网络安全 | Web安全常见漏洞和防护经验策略
  • 可视化-Visualization
  • Jgit Packfile is truncated解决方案
  • c++中的char[] ,char* ,string三种字符串变量转化的兼容原则
  • Unity_ShaderGraph节点问题
  • e^{ix} 的 conjugate value(复共轭)
  • 易点易动设备管理系统——精确管理BOM,提升生产效率
  • 【AI绘画+Midjourney平替】Fooocus:图像生成、修改软件(Controlnet原作者重新设计的UI+Windows一键部署)
  • Autovue R21.1 发布
  • Flask 入门4:Flask 模板
  • 容器化技术基础概念:雪花服务器与凤凰服务器
  • IEC61499 学习记录
  • 敏捷软件研发管理流程- scrum
  • VXLAN:虚拟化网络的强大引擎
  • JSch - 配置SFTP服务器SSH免密登录
  • C语言学习(6)—— 指针
  • 第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述
  • ST-LINK USB communication error的解决办法
  • npm修改镜像源
  • 运算符重载(在c++中使用set、map存储结构体)
  • C++进阶(十一)C++11
  • 面试经典题---76.最小覆盖子串