【问题标题】:java.security.GeneralSecurityException CryptoCipher when using Apache Crypto Commons使用 Apache Crypto Commons 时出现 java.security.GeneralSecurityException CryptoCipher
【发布时间】:2018-06-09 02:43:31
【问题描述】:

我正在尝试使用此处的代码进行加密 https://commons.apache.org/proper/commons-crypto/xref-test/org/apache/commons/crypto/examples/CipherByteArrayExample.html。我逐字复制了代码,但我不确定为什么会出现这个异常,因为我在这个问题上找不到太多。我唯一更改的部分是“StandardCharsets.UTF_8”到字符串“UTF-8”。我也对使用 Bouncy Castle 或 java JCE 作为替代方案不感兴趣,但我对在 CBC/ECB 模式下使用 AES/DES 的其他库持开放态度(我知道 DES/ECB 的危险,因此不需要讲座)。谢谢。

编辑:

堆栈跟踪(注意 Crypto.java 的第 62 行是“CryptoCipher encipher=Utils.getCipherInstance(transform, properties) ):

    W/System.err: java.io.IOException: java.security.GeneralSecurityException: CryptoCipher {org.apache.commons.crypto.cipher.OpenSslCipher} is not available or transformation AES/CBC/PKCS5Padding is not supported.
                  at org.apache.commons.crypto.utils.Utils.getCipherInstance(Utils.java:130)
                  at com.example.me.cryptotest.Crypto.test(Crypto.java:62)
                  at com.example.me.cryptotest.MainActivity.onCreate(MainActivity.java:43)
                  at android.app.Activity.performCreate(Activity.java:7009)
                  at android.app.Activity.performCreate(Activity.java:7000)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    W/System.err: 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
                  at android.app.ActivityThread.-wrap11(Unknown Source:0)

    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
                  at android.os.Handler.dispatchMessage(Handler.java:106)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
              Caused by: java.security.GeneralSecurityException: CryptoCipher {org.apache.commons.crypto.cipher.OpenSslCipher} is not available or transformation AES/CBC/PKCS5Padding is not supported.
                  at org.apache.commons.crypto.cipher.CryptoCipherFactory.getCryptoCipher(CryptoCipherFactory.java:176)

    at org.apache.commons.crypto.utils.Utils.getCipherInstance(Utils.java:128)
                ... 15 more

    W/System.err: Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
                  at org.apache.commons.crypto.utils.ReflectionUtils.newInstance(ReflectionUtils.java:90)
                  at org.apache.commons.crypto.cipher.CryptoCipherFactory.getCryptoCipher(CryptoCipherFactory.java:160)
                ... 16 more
              Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Constructor.newInstance0(Native Method)
                  at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        W/System.err:     
at     org.apache.commons.crypto.utils.ReflectionUtils.newInstance(ReflectionUtils.java:88)
                ... 17 more

    Caused by: java.lang.RuntimeException: java.lang.RuntimeException: no native library is found for os.name=Linux and os.arch=x86
                  at org.apache.commons.crypto.cipher.OpenSslCipher.<init>(OpenSslCipher.java:59)
                ... 20 more
              Caused by: java.lang.RuntimeException: no native library is found for os.name=Linux and os.arch=x86
                  at org.apache.commons.crypto.NativeCodeLoader.findNativeLibrary(NativeCodeLoader.java:120)
                  at org.apache.commons.crypto.NativeCodeLoader.loadLibrary(NativeCodeLoader.java:62)
                  at org.apache.commons.crypto.NativeCodeLoader.<clinit>(NativeCodeLoader.java:50)
                  at org.apache.commons.crypto.NativeCodeLoader.isNativeCodeLoaded(NativeCodeLoader.java:261)
                  at org.apache.commons.crypto.Crypto.isNativeCodeLoaded(Crypto.java:84)
W/System.err:     at org.apache.commons.crypto.cipher.OpenSsl.<clinit>(OpenSsl.java:94)
                  at org.apache.commons.crypto.cipher.OpenSsl.getLoadingFailureReason(OpenSsl.java:114)
                  at org.apache.commons.crypto.cipher.OpenSslCipher.<init>(OpenSslCipher.java:57)
                ... 20 more

【问题讨论】:

  • 你有异常堆栈跟踪要分享吗?请注意,我在本地运行了相同的代码,它就像一个魅力。
  • @AmithKumar 嗯,这很有趣。是的,它就在这里。

标签: java apache encryption cryptography


【解决方案1】:

我在这里看到了你的问题:

java.lang.RuntimeException: no native library is found for os.name=Linux and os.arch=x86

看起来您没有使用 Oracle JVM。可能您的 JVM 报告的 os.arch 字符串与标准 Oracle JVM 不同,因此您需要将本机库从可能的 linux/i386 复制到 linux/x86(猜测)。对此错误no native library is found for os.name=Linux and os.arch=x86 进行谷歌搜索,并使用您的操作系统和 JVM 来帮助您的运行时找到所需的本机库。

更新: 如果您查看项目on github 的“README.md”。你会注意到这一点:

Portable across various operating systems (currently only Linux/MacOSX/Windows); Apache Commons Crypto loads the library according to your machine environment (it checks system properties, os.name and os.arch).

这是他们在代码中的dll结构,

因此您可以覆盖您的系统属性“os.arch”以根据您的操作系统加载本机库:

System.setProperty("os.arch", "@folder")

仅供参考,我在 Windows 10 中使用 Oracle JDK8 运行代码,所以我的派生路径是 /org/apache/commons/crypto/native/Windows/x86_64/commons-crypto.dll

希望这将为您解决问题提供更多帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多