java.security.GeneralSecurityException CryptoCipher при использовании Apache Crypto Commons - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь использовать код здесь для шифрования 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 в качестве альтернативы, но я открыт для других библиотек, которые используют AES / DES в режимах CBC / ECB (я знаю об опасностях DES / ECB, поэтому нет необходимости в лекции).Спасибо.

РЕДАКТИРОВАТЬ:

Трассировка стека (обратите внимание, что строка 62 Crypto.java - это "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

1 Ответ

0 голосов
/ 08 июня 2018

Я вижу вашу проблему здесь:

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 (дикое предположение).Запустите поиск google по этой ошибке no native library is found for os.name=Linux and os.arch=x86 и поэкспериментируйте с вашей операционной системой и JVM, чтобы помочь вашей среде выполнения найти необходимые собственные библиотеки.

Обновление: если вы посмотрите на README.mdпроект на github .Вы заметите это:

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, которую они имеют в коде,

enter image description here

так что вы можете переопределить системное свойство 'os.arch' для загрузки собственной библиотеки в соответствии с вашей ОС:

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

Просто для справки, я запускаю код в Windows 10 с Oracle JDK8,поэтому мой производный путь приближается к /org/apache/commons/crypto/native/Windows/x86_64/commons-crypto.dll

Надеюсь, это поможет вам в решении проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...