美文网首页
关于AES加密方式在win和linux 下面加密结果值不同,解决

关于AES加密方式在win和linux 下面加密结果值不同,解决

作者: 喊我小王吧 | 来源:发表于2019-03-08 15:53 被阅读0次

AES加密方式在win和linux 下面加密结果值不同

关于值为什么不同,原因是底层调用了Java 代码 native()那个方法。所以在不同的系统上加密后的值也就不同了。

解决办法:

下面例子本人亲测可以正常使用:

package com.example.bwjf.demo.util;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.SecureRandom;
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 org.springframework.util.StringUtils;

public class AESutil
{
  private static final Logger log = LoggerFactory.getLogger(AESutil.class);
  
  public static String encrypt(String content, String secureKey)
  {
    try
    {
      if ((StringUtils.isEmpty(content)) || 
        (StringUtils.isEmpty(secureKey))) {
        return null;
      }
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      secureRandom.setSeed(secureKey.getBytes());
      kgen.init(128, secureRandom);
      SecretKey secretKey = kgen.generateKey();
      byte[] enCodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      byte[] byteContent = content.getBytes("utf-8");
      cipher.init(1, key);
      byte[] result = cipher.doFinal(byteContent);
      return encodeBASE64(result);
    }
    catch (Exception e)
    {
      log.error("��������.", e);
    }
    return null;
  }
  
  public static String decrypt(String content, String secureKey)
  {
    try
    {
      if ((StringUtils.isEmpty(content)) || (StringUtils.isEmpty(secureKey))) {
        return null;
      }
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      secureRandom.setSeed(secureKey.getBytes());
      kgen.init(128, secureRandom);
      SecretKey secretKey = kgen.generateKey();
      byte[] enCodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(2, key);
      byte[] base64Dec = Base64.decode(content);
      byte[] result = cipher.doFinal(base64Dec);
      return new String(result);
    }
    catch (Exception e)
    {
      log.warn("��������,����������:{}", e);
    }
    return null;
  }
  
  public static String encodeBASE64(byte[] content)
    throws Exception
  {
    if ((content == null) || (content.length == 0)) {
      return null;
    }
    try
    {
      return Base64.encode(content);
    }
    catch (Exception e)
    {
      log.error("Base64 encode error.", e);
    }
    return null;
  }
}

或者

package com.example.bwjf.demo.util;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.IOException;
import java.io.PrintStream;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AESutil2
{
  public static String Encrypt(String sSrc, String sKey)
  {
    try
    {
      if (sKey == null)
      {
        System.out.print("Key����null");
        return null;
      }
      if (sKey.length() != 16)
      {
        System.out.print("Key��������16��");
        return null;
      }
      byte[] raw = sKey.getBytes("utf-8");
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(1, skeySpec);
      byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
      
      return encryptBASE64(encrypted);
    }
    catch (Exception ex)
    {
      System.out.println(ex.toString());
    }
    return null;
  }
  
  public static String Decrypt(String sSrc, String sKey)
  {
    try
    {
      if (sKey == null)
      {
        System.out.print("Key����null");
        return null;
      }
      if (sKey.length() != 16)
      {
        System.out.print("Key��������16��");
        return null;
      }
      byte[] raw = sKey.getBytes("utf-8");
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(2, skeySpec);
      byte[] encrypted1 = decryptBASE64(sSrc);
      try
      {
        byte[] original = cipher.doFinal(encrypted1);
        return new String(original, "utf-8");
      }
      catch (Exception e)
      {
        System.out.println(e.toString());
        return null;
      }
      return null;
    }
    catch (Exception ex)
    {
      System.out.println(ex.toString());
    }
  }
  
  public static byte[] decryptBASE64(String key)
    throws IOException
  {
    return new BASE64Decoder().decodeBuffer(key);
  }
  
  public static String encryptBASE64(byte[] key)
  {
    return new BASE64Encoder().encodeBuffer(key);
  }
  
  public static String encrypt(String content, String secureKey)
  {
    try
    {
      if ((StringUtils.isEmpty(content)) || (StringUtils.isEmpty(secureKey))) {
        return null;
      }
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      secureRandom.setSeed(secureKey.getBytes());
      kgen.init(128, secureRandom);
      SecretKey secretKey = kgen.generateKey();
      byte[] enCodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      byte[] byteContent = content.getBytes("utf-8");
      cipher.init(1, key);
      byte[] result = cipher.doFinal(byteContent);
      return encodeBASE64(result);
    }
    catch (Exception e)
    {
      System.err.print("��������." + e);
    }
    return null;
  }
  
  public static String decrypt(String content, String secureKey)
  {
    try
    {
      if ((StringUtils.isEmpty(content)) || (StringUtils.isEmpty(secureKey))) {
        return null;
      }
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      secureRandom.setSeed(secureKey.getBytes());
      kgen.init(128, secureRandom);
      SecretKey secretKey = kgen.generateKey();
      byte[] enCodeFormat = secretKey.getEncoded();
      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(2, key);
      byte[] base64Dec = Base64.decode(content);
      byte[] result = cipher.doFinal(base64Dec);
      return new String(result);
    }
    catch (Exception e)
    {
      System.err.println("��������,����������:{}" + e);
    }
    return null;
  }
  
  public static String encodeBASE64(byte[] content)
    throws Exception
  {
    if ((content == null) || (content.length == 0)) {
      return null;
    }
    try
    {
      return Base64.encode(content);
    }
    catch (Exception e)
    {
      System.err.println("Base64 encode error." + e);
    }
    return null;
  }
}

相关文章

  • 关于AES加密方式在win和linux 下面加密结果值不同,解决

    AES加密方式在win和linux 下面加密结果值不同 关于值为什么不同,原因是底层调用了Java 代码 nat...

  • python加密

    常用加密 AES加密 AES加密(有key和vi)

  • 前后端交互数据加解密

    1 加密方式介绍 本文提供了一种前后端交互数据的加解密方法,主要涉及了AES和RSA两种加密方式。 AES加密 A...

  • iOS代码加密常用加密方式

    iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密、AES加密、BASE64加密,三大...

  • iOS常用加密方式

    iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密、AES加密、BASE64加密,三大...

  • AES+RSA加密联合使用

    AES+RSA加密联合使用 使用原因: 因为加密解密效率的问题 使用方式前端:前端对需要加密的数据进性AES加密,...

  • Java(Android)、Golang、Node.js三种语言

    java(Android)版的AES加密 Node.js版AES加密 Golang版AES加密 Java版本和No...

  • 加密方式

    加密方式 1.可加密,可解密 Base64编码 对称加密AES加密DES加密有两种模式,ECB和CBC 非对称加密...

  • javax.crypto.BadPaddingException

    在做AES加解密的时候遇到这个问题,发现win现每次加密结果都一样,但是linux下每次都是随机的,后来在网上找到...

  • iOS-15 加密

    1iOS 常用加密方式讲解 - 简书 2iOS加密方式(RSA签名、加密、AES) - 简书

网友评论

      本文标题:关于AES加密方式在win和linux 下面加密结果值不同,解决

      本文链接:https://www.haomeiwen.com/subject/avwrpqtx.html