java - 在另一台设备上使用 EasyCrypt 库完成密码时出错

标签 java android firebase encryption cryptography

我尝试在加密语音文件后对其进行解密,将其上传到 Firebase 然后下载。对于加密/解密,我正在使用 EasyCrypt

  • 加密和上传成功完成。
  • 下载成功。
  • 我已经检查了加密 key ,它与 解密一个。
  • 已授予权限。
    • 即使下载新文件后,解密仍可在同一设备上进行。

当我在另一台设备上获取下载的文件并尝试解密它时,如下所示:

final File decryptedVoice = new File(myFilePath + "/" + dateHolder + ".mp4");
final File encryptedFile = new File(voiceURL);
progressBar.setVisibility(View.VISIBLE);
ECSymmetric ecSymmetric = new ECSymmetric();
ecSymmetric.decrypt(encryptedFile, voiceKey, new ECResultListener() {
    @Override
    public void onProgress(int i, long l, long l1) {
        Log.e("EncryptedFile", encryptedFile.getPath());
        Log.e("DecryptedFile", decryptedVoice.getAbsolutePath());
        Log.e(" DecryptionKey", decryptionKey);
        Log.i("VoiceDecryption", String.valueOf((l*100)/l1));
    }

    @Override
    public <T> void onSuccess(T t) {
        progressBar.setVisibility(View.GONE);
        pause.setVisibility(View.VISIBLE);
        try {
            mediaPlayer.setDataSource(decryptedVoice.getAbsolutePath());
            mediaPlayer.prepare();
            mediaPlayer.setVolume(10,10);
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    seekBar.setMax(mediaPlayer.getDuration());
                    mediaPlayer.start();
                    update(mediaPlayer, time, seekBar);


                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(String s, Exception e) {
        Log.e(s, e.toString());
    }
}, decryptedVoice);

解密完成 99%,然后出现以下错误:

E/Cannot write to file.: java.io.IOException: Error while finalizing cipher

这是错误的完整堆栈:

08-18 18:54:30.578 30039-30989/com.berbangchat.me I/VoiceDecryption: 99
08-18 18:54:30.583 30039-30989/com.berbangchat.me W/System.err: java.io.IOException: Error while finalizing cipher
        at javax.crypto.CipherInputStream.fillBuffer(CipherInputStream.java:104)
        at javax.crypto.CipherInputStream.read(CipherInputStream.java:155)
        at java.io.InputStream.read(InputStream.java:162)
        at com.pvryan.easycrypt.symmetric.performDecrypt.invoke$easycrypt_release(performDecrypt.kt:124)
        at com.pvryan.easycrypt.symmetric.ECSymmetric$decrypt$1.invoke(ECSymmetric.kt:209)
        at com.pvryan.easycrypt.symmetric.ECSymmetric$decrypt$1.invoke(ECSymmetric.kt:44)
        at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Async.kt:140)
        at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Async.kt)
        at org.jetbrains.anko.AsyncKt$sam$Callable$761a5578.call(Async.kt)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
    Caused by: javax.crypto.BadPaddingException: error:1e06b065:Cipher functions:EVP_DecryptFinal_ex:BAD_DECRYPT
08-18 18:54:30.583 30039-30989/com.berbangchat.me W/System.err:     at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
08-18 18:54:30.583 30039-30989/com.berbangchat.me W/System.err:     at com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER.doFinalInternal(OpenSSLCipher.java:568)
        at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:385)
        at javax.crypto.Cipher.doFinal(Cipher.java:1476)
08-18 18:54:30.583 30039-30989/com.berbangchat.me W/System.err:     at javax.crypto.CipherInputStream.fillBuffer(CipherInputStream.java:102)
        ... 14 more
08-18 18:54:30.583 30039-30989/com.berbangchat.me E/CipherError: Cannot write to file. : java.io.IOException: Error while finalizing cipher

注意:测试的设备运行的 Android 版本不同,一个是 Marshmallow,一个是 Oreo。

最佳答案

我认为您的问题是设备没有运行用于加密和解密的相同 OpenSSL 版本。我在您的错误日志中搜索了另一个错误。

由以下原因引起:javax.crypto.BadPaddingException:错误:1e06b065:密码函数:EVP_DecryptFinal_ex:BAD_DECRYPT

看看这个 SO question了解更多信息。我知道这并不能完全回答你的问题,但我希望它能让你开始。

关于java - 在另一台设备上使用 EasyCrypt 库完成密码时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008639/

相关文章:

java - 使用 HttpServletRequest#getDateHeader() 解析 RFC1123 日期时出现异常

java - 在java中使用数字编辑文本时出现问题

java - 如何以编程方式限制下载速度?

android - 如何添加 Firebase 对象/节点+子树修改时的时间戳?

firebase - firestore 是否支持事务中的集合级锁?

java - 使用 Guice 注入(inject)运行时生成的值

java - 一次定义多个类@Deprecated

java - 使用JavaScript替代Java进行签名加密(DESede/CBC/PKCS5Padding)

android - 如何为 volley MultipartEntityBuilder 添加多个 Mime 类型

swift - 如何在 firebase 中隔离用户数据?