文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java和PHP完美对接AES加解密,密钥处理要注意

2023-08-31 14:58

关注

对于应用程序进行加密保护,AES算法被广泛使用。但是在使用Java和PHP进行AES加解密时,很多人都会遇到一些困难。本文就来介绍一下如何实现Java和PHP的完美对接AES加解密。

在进行AES加解密时,我们需要注意以下几个方面:

  1. 确定加密算法模式、密钥长度、补码方式、解密串编码方式等参数
  2. 密钥处理,是否需要进行算法处理
  3. 在Java中,加密算法模式和补码方式需要写完整参数格式

首先,我们需要了解AES加解密的基础知识。无论用哪种语言实现AES加解密,首要考虑的是加密算法模式、密钥长度、补码方式和解密串编码方式等几个参数。确认好这些参数之后,基本上不会出现什么意外情况。

但是不出意外的还是出现意外了,Java使用Cipher cipher = Cipher.getInstance(AES);初始化对象的时候,算法模式和补码方式是什么?不一定所有人都知道,不熟悉java的人只能翻文档或者各种尝试,我现在就直接给出答案 AES = AES/ECB/PKCS5Padding。其他的都需要写完整参数格式例如:AES/CBC/PKCS5Padding等等,写完整参数的,我们可以直接看出来。

算法模式和补码方式确定好之后,用php只要确定好算法模式、补码方式即可。

另外需要注意的就是密钥是否做了算法处理,比如我之前碰到的java的代码里key做了SHA1PRNG算法处理,那么再php里同样做一次SHA1PRNG算法处理即可,下面贴出php代码和java代码

【php代码】

//密钥,根据实际情况来决定是否需要做base64_decode$keySource = base64_decode("a2V5LXpoZXNoaWtleS1qaXVzaGlrZXk=");//key做SHA1PRNG算法处理,根据实际情况决定是否处理$key= substr(openssl_digest(openssl_digest($keySource, 'sha1', true), 'sha1', true), 0, 16);$content = "ABC123";$cipher_algo="aes-128-ecb";//加密function aes_encrypt($content, $key) {    $encryptContent = openssl_encrypt(    $content,//要加/解密的内容    $cipher_algo,//加密模式: 可以通过openssl_get_cipher_methods()获取有效密码方式列表    $key,//加密密钥[密码]    OPENSSL_RAW_DATA,//数据格式选项(可选)【选项有:】:0,OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2,OPENSSL_NO_PADDING=3;它有着很重要的作用:0:默认模式,自动进行 pkcs7 补位,同时自动进行 base64 编,1:OPENSSL_RAW_DATA,自动进行 pkcs7 补位, 但是不自动进行 base64 编码2:OPENSSL_ZERO_PADDING,需要自己进行 pkcs7 补位,同时自动进行 base64 编码    '');    $encryptContent = base64_encode($encryptContent);    return $encryptContent;}//解密function aes_decrypt($content, $key) {    $decryptContent = openssl_decrypt(    base64_decode($content),//要加/解密的内容    $cipher_algo,//加密模式: 可以通过openssl_get_cipher_methods()获取有效密码方式列表    $key,//加密密钥[密码]    OPENSSL_RAW_DATA,//数据格式选项(可选)【选项有:】:0,OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2,OPENSSL_NO_PADDING=3;它有着很重要的作用:0:默认模式,自动进行 pkcs7 补位,同时自动进行 base64 编,1:OPENSSL_RAW_DATA,自动进行 pkcs7 补位, 但是不自动进行 base64 编码2:OPENSSL_ZERO_PADDING,需要自己进行 pkcs7 补位,同时自动进行 base64 编码    '');    return $decryptContent;}

【java代码】

    private static final String ENCRYPT_KEY = "a2V5LXpoZXNoaWtleS1qaXVzaGlrZXk=";    public static String encrypt(String value) {        return null==value ? null : aesEncrypt(value, ENCRYPT_KEY);    }    public static String decrypt(String value) {        return null==value ? null : aesDecrypt(value, ENCRYPT_KEY);    }    private static String aesEncrypt(String value, String encryptKey) {        try {            String key = encryptKey(encryptKey);            if (null == key) {                return null;            } else {                KeyGenerator kgen = KeyGenerator.getInstance("AES");                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");                secureRandom.setSeed(key.getBytes());                kgen.init(128, secureRandom);                Cipher cipher = Cipher.getInstance("AES");//默认 AES = AES/ECB/PKCS5Padding                cipher.init(1, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));                byte[] bytes = value.getBytes(StandardCharsets.UTF_8);                byte[] resultBytes = cipher.doFinal(bytes);                return base64Encode(resultBytes);            }        } catch (Exception e) {            log.error("encrypt error", AESUtils.class, new Object[]{e});            return null;        }    }    private static String aesDecrypt(String value, String encryptKey) {        try {            String key = encryptKey(encryptKey);            if (null == key) {                return null;            } else {                byte[] bytes = base64Decode(value);                KeyGenerator kgen = KeyGenerator.getInstance("AES");                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");                secureRandom.setSeed(key.getBytes());                kgen.init(128, secureRandom);                Cipher cipher = Cipher.getInstance("AES");//默认 AES = AES/ECB/PKCS5Padding                cipher.init(2, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));                byte[] result = cipher.doFinal(bytes);                return new String(result, StandardCharsets.UTF_8);            }        } catch (Exception e) {            log.error("encrypt error", AESUtils.class, new Object[]{e});            return null;        }    }    private static String base64Encode(byte[] bytes) {        return new String(Base64.encodeBase64(bytes), StandardCharsets.UTF_8);    }    private static byte[] base64Decode(String base64Value) {        byte[] decode = base64Value.getBytes(StandardCharsets.UTF_8);        return null != decode ? Base64.decodeBase64(decode) : new byte[0];    }    private static String encryptKey(String key) {        return EmptyUtils.isEmpty(base64Decode(key)) ? null : new String(base64Decode(key), StandardCharsets.UTF_8);    }

来源地址:https://blog.csdn.net/jsh13579/article/details/130616800

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯