zoukankan      html  css  js  c++  java
  • AES加密算法在linux下解密失败,windows下成功的问题

     1 package com.more;
     2 
     3 
     4 import java.security.NoSuchAlgorithmException;
     5 import java.security.SecureRandom;
     6 import javax.crypto.Cipher;
     7 import javax.crypto.KeyGenerator;
     8 import javax.crypto.SecretKey;
     9 import javax.crypto.spec.SecretKeySpec;
    10 import org.apache.commons.codec.binary.Base64;
    11 
    12 public class AESUtil
    13 {  
    14   public static String encrypt(String content, String password)
    15   {
    16     try
    17     {
    18       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    19       
    20       byte[] byteContent = content.getBytes("utf-8");
    21       SecretKeySpec secreKeySpec = getSecretKey(password);
    22       cipher.init(1, secreKeySpec);
    23       
    24       byte[] result = cipher.doFinal(byteContent);
    25       
    26       return Base64.encodeBase64String(result);
    27     }
    28     catch (Exception ex)
    29     {
    30       ex.printStackTrace();
    31     }
    32     return null;
    33   }
    34   
    35   public static String decrypt(String content, String password)
    36   {
    37     try
    38     {
    39       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    40       
    41 
    42       cipher.init(2, getSecretKey(password));
    43       
    44 
    45       byte[] result = cipher.doFinal(Base64.decodeBase64(content));
    46       
    47       return new String(result, "utf-8");
    48     }
    49     catch (Exception ex)
    50     {
    51         ex.printStackTrace();
    52     }
    53     return null;
    54   }
    55   
    56   private static SecretKeySpec getSecretKey(String password)
    57   {
    58     KeyGenerator kg = null;
    59     try
    60     {
    61       kg = KeyGenerator.getInstance("AES");
    62       
    63       SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    64       secureRandom.setSeed(password.getBytes());
    65       
    66       kg.init(128, secureRandom);
    67       
    68 
    69       SecretKey secretKey = kg.generateKey();
    70       
    71       return new SecretKeySpec(secretKey.getEncoded(), "AES");
    72     }
    73     catch (NoSuchAlgorithmException ex)
    74     {
    75         ex.printStackTrace();
    76     }
    77     return null;
    78   }
    79 }
    AESUtils

    在linux系统下抛出异常:javax.crypto.BadPaddingException: Given final block not properly padded。

    在工具类中增加调用了 setSeed 方法。

    原因分析
    SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。

    文章解决方式来源于:https://m.jb51.net/article/40941.htm

  • 相关阅读:
    java调用批处理后关闭窗口
    MD5Util校验大型文件
    Spring注解无法注入Session监听器解决办法
    验证码插件kaptcha的jsp使用
    JavaScript 模式化窗口使用方法
    HttpSessionListener中获取Spring中的Bean
    Spring 注解AOP 入门
    uploadify上传小札记【jsp版本】【亲测有效】
    ffmpeg视频转换及截图
    SpringMVC视图的创建
  • 原文地址:https://www.cnblogs.com/zhangjiangbin/p/11354418.html
Copyright © 2011-2022 走看看