问答

求助:java AES加密 转php AES

作者:admin 2021-05-05 我要评论

哪位大神能帮我把这段java的aes加密写成php版的 package com.ruoyi.util; import java.math.BigInteger; import java.security.MessageDigest; import java.secu...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

哪位大神能帮我把这段java的aes加密写成php版的

    package com.ruoyi.util;

    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Base64;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;

   
    public class SymmetricEncoder {

        private static Logger symmetricEncoderlogger = LoggerFactory.getLogger(SymmetricEncoder.class);
    
        /*
     * 加密 1.构造密钥生成器 2.根据ecnodeRules规则初始化密钥生成器 3.产生密钥 4.创建和初始化密码器 5.内容加密 6.返回字符串
     */
    public static String AESEncode(String encodeRules, String content) {
        try {
            // 1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            // 2.根据ecnodeRules规则初始化密钥生成器
            // 生成一个128位的随机源,根据传入的字节数组
            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
            // 3.产生原始对称密钥
            SecretKey original_key = keygen.generateKey();
            // 4.获得原始对称密钥的字节数组
            byte[] raw = original_key.getEncoded();
            // 5.根据字节数组生成AES密钥
            SecretKey key = new SecretKeySpec(raw, "AES");
            // 6.根据指定算法AES自成密码器
            Cipher cipher = Cipher.getInstance("AES");
            // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(Cipher.ENCRYPT_MODE, key);
            // 8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
            byte[] byte_encode = content.getBytes("utf-8");
            // 9.根据密码器的初始化方式--加密:将数据加密
            byte[] byte_AES = cipher.doFinal(byte_encode);
            // 10.将加密后的数据转换为字符串
            // 这里用Base64Encoder中会找不到包
            // 解决办法:
            // 在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
            String AES_encode = new String(new BASE64Encoder().encode(byte_AES));
            // 11.将字符串返回
            return AES_encode;
        } catch (Exception e) {
            symmetricEncoderlogger.error("AES加密失败",e);
        }

        // 如果有错就返加nulll
        return null;
    }

    public static String stringToMD5(String plainText) {
        byte[] secretBytes = null;
        try {
            MessageDigest digest = MessageDigest.getInstance("md5");
            digest.update(plainText.getBytes());
            secretBytes = digest.digest();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("没有这个md5算法!");
        }
        String md5code = new BigInteger(1, secretBytes).toString(16);
        return md5code;
    }
    
    public static void main(String[] args) {
        String cipher = stringToMD5(AESEncode("密钥", "XML内容"));
        System.out.println("生成的密文为:"+cipher);
    }

}
###

你这段代码没意义. 密钥生成以后, 你直接给扔了, 又解密不了.

$key = '密钥';
$data = '数据';
$method = 'aes-128-cbc';
$iv_length = openssl_cipher_iv_length($method);
$iv = random_bytes($iv_length);
$加密后的值 = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
var_dump($加密后的值);
$解密结果 = openssl_decrypt($加密后的值, $method, $key, OPENSSL_RAW_DATA, $iv);
var_dump($解密结果);
// 应该是 ecb 没iv的模式
$key = '密钥';
$data = '数据';
$method = 'aes-128-ecb';
//$iv_length = openssl_cipher_iv_length($method);
//$iv = random_bytes($iv_length);
$加密后的值 = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA);
var_dump($加密后的值);
$解密结果 = openssl_decrypt($加密后的值, $method, $key, OPENSSL_RAW_DATA);
var_dump($解密结果);

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 求助:java AES加密 转php AES

    求助:java AES加密 转php AES

  • php如何连接java的mysql连接池?

    php如何连接java的mysql连接池?

  • 怎么找jpress的war包?

    怎么找jpress的war包?

  • html页面统一绝对路径

    html页面统一绝对路径

腾讯云代理商
海外云服务器