Java AES 256加密/解密NoSuchProviderException在打包到.exe时(使用高级安装程序9.4)

Java AES 256加密/解密NoSuchProviderException在打包到.exe时(使用高级安装程序9.4),java,encryption,cryptography,aes,nosuchproviderexception,Java,Encryption,Cryptography,Aes,Nosuchproviderexception,我一直在开发一个使用AES-256加密来编写文件的软件。我使用的是Eclipse64位和JDK7。问题是,当我编译和执行代码时,无论是加密算法还是解密算法,它都能完美地工作。当我打包一个Runnable JAR并运行它时,它也可以正常工作……但是当我使用高级安装程序9.4将Runnable JAR打包到Windows可执行文件(.exe)中时,安装它(W7 32位和64位)…会弹出一个NoSuchProviderException并对任何内容进行加密/解密 我需要将此软件分发给许多用户,但找不到

我一直在开发一个使用AES-256加密来编写文件的软件。我使用的是Eclipse64位和JDK7。问题是,当我编译和执行代码时,无论是加密算法还是解密算法,它都能完美地工作。当我打包一个Runnable JAR并运行它时,它也可以正常工作……但是当我使用高级安装程序9.4将Runnable JAR打包到Windows可执行文件(.exe)中时,安装它(W7 32位和64位)…会弹出一个NoSuchProviderException并对任何内容进行加密/解密

我需要将此软件分发给许多用户,但找不到运行.exe的方法

public static String AES_Encode(String str, String key) throws Exception {

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  

    SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    String encryptedString = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));

    return encryptedString;


}

public static String AES_Decode(String str, String key) throws Exception {

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

    cipher.init(Cipher.DECRYPT_MODE, secretKey);

    String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(str)),"UTF-8");

    return decryptedString;

}
我已经尝试显示提供程序可用,并且在Windows中安装软件后运行该软件时,SunJCE或JCE不可用;尽管当我运行JAR或编译代码时,它们是。有什么我能做的吗?我可以换到Bouncy Castle吗?如何(我需要在我的项目中集成什么JAR或类似的东西?)


谢谢你的时间和帮助

问题在于,Advanced Installer中的项目配置为压缩Pack200中包含的JAR,这破坏了这些JAR的一部分的数字签名


解决方案是完全禁用Pack200压缩,或者转到“高级安装程序”中的“主应用程序菜单->选项->外部工具”,并在出现的对话框中指定应用程序目标JDK的安装路径。(最后一种方法将允许高级安装程序检查压缩的JAR的数字签名,检测哪个签名被破坏,并自动从压缩中跳过这些JAR,但仍然压缩包中的其他内容).

您可以尝试在执行时安装提供程序
import org.bouncycastle.jce.provider.BouncyCastleProviderCipher-Cipher=Cipher.getInstance(“AES/ECB/PKCS5Padding”,“BC”)我还需要将Bouncy Castle的external.jar添加到项目中,并将其作为提供者添加,对吗?如何将其添加为提供程序?在项目中创建一个名为“lib”的目录,在其中复制JAR文件,然后从JAR文件的上下文菜单中选择“Build Path”->“添加到构建路径能否将一个压缩的示例发送到advancedinstaller.com的技术支持部门,以便我们可以尝试复制此示例。我们使用您提供的代码示例编写了两个非常小的应用程序,但它们对我们(高级安装程序团队)运行良好,也就是说,没有出现异常情况。至于:
key.getBytes(“UTF-8”)
:密钥不是也不应该是
字符串。AES密钥应该包含攻击者无法区分的随机位,并且不是每个字节值都可以由
getBytes()
生成,尤其是对于UTF-8。博根明白了!谢谢你,这解决了我的问题和许多头疼的事!