AES加密解密Windows下正常linux下结果为空解密失败

加密过程需手动指定随机数的生成规则,解密过程中也需手动指定随机数的生成规则。
java.security.SecureRandom
此类提供加密的强随机数生成器 (RNG)。许多实现都是伪随机数生成器 (PRNG) 形式,这意味着它们将使用确定的算法根据实际的随机种子生成伪随机序列。其他实现可以生成实际的随机数,而另一些实现则可能结合使用这两项技术。

有以下两种请求 SecureRandom 对象的方法:仅指定算法名称,或者既指定算法名称又指定包提供程序。
1: 如果仅指定算法名称,如下所示:
SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG");
系统将确定环境中是否有所请求的算法实现,是否有多个,是否有首选实现。
2: 如果既指定了算法名称又指定了包提供程序,如下所示:
SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG", "SUN");

系统将确定在所请求的包中是否有算法实现;如果没有,则抛出异常。

/**
 * 加密函数
 * @param content   加密的内容
 * @param strKey    密钥
 * @return          返回二进制字符数组
 * @throws Exception
 */
public static byte[] enCrypt(String content,String strKey) throws Exception{
    KeyGenerator keygen;
    SecretKey desKey;
    Cipher c;
    byte[] cByte;
    String str = content;

    keygen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(strKey.getBytes());
    keygen.init(128, secureRandom);
    //keygen.init(128, new SecureRandom(strKey.getBytes()));

    desKey = keygen.generateKey();
    c = Cipher.getInstance("AES");

    c.init(Cipher.ENCRYPT_MODE, desKey);

    cByte = c.doFinal(str.getBytes("UTF-8"));

    return cByte;
}

/** 解密函数
 * @param src   加密过的二进制字符数组
 * @param strKey  密钥
 * @return
 * @throws Exception
 */
public static String deCrypt (byte[] src,String strKey) throws Exception{
    KeyGenerator keygen;
    SecretKey desKey;
    Cipher c;
    byte[] cByte;

    keygen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(strKey.getBytes());
    keygen.init(128, secureRandom);
    //keygen.init(128, new SecureRandom(strKey.getBytes()));

    desKey = keygen.generateKey();
    c = Cipher.getInstance("AES");

    c.init(Cipher.DECRYPT_MODE, desKey);


    cByte = c.doFinal(src);

    return new String(cByte,"UTF-8");
}



你可能感兴趣的:(java后台)