Android 为什么本机rsa本机解密有时才起作用?

Android 为什么本机rsa本机解密有时才起作用?,android,react-native,encryption,async-await,rsa,Android,React Native,Encryption,Async Await,Rsa,我正在编写一个端到端加密的聊天应用程序,至少花了一天时间解决这个问题。我使用的是react native rsa native,并且在消息解密方面遇到了一个问题,我似乎在任何地方都找不到相关文档 在屏幕加载时,使用useEffect调用,这将调用一个函数,该函数在正确的Firebase子级上注册对“child_added”事件的回调。回调反过来运行一个函数,对从Firebase检索到的消息进行解密 根据Firebase文档,此回调有两种不同的运行方式。一种方法是在页面加载时,对Firebase树

我正在编写一个端到端加密的聊天应用程序,至少花了一天时间解决这个问题。我使用的是react native rsa native,并且在消息解密方面遇到了一个问题,我似乎在任何地方都找不到相关文档

在屏幕加载时,使用useEffect调用,这将调用一个函数,该函数在正确的Firebase子级上注册对“child_added”事件的回调。回调反过来运行一个函数,对从Firebase检索到的消息进行解密

根据Firebase文档,此回调有两种不同的运行方式。一种方法是在页面加载时,对Firebase树的选定位置中的每个现有子级运行一次回调。然后,每次出现新的子对象时,该函数都会运行一次

使这个问题如此混乱的是,解密程序只在前一种情况下失败。当屏幕加载时,函数的初始运行(传入所有正确的数据)会导致RSAKeychain.decrypt(文本,keyTag);在没有提供其他消息的情况下抛出IllegalBlockSizeException。我知道这种问题甚至不应该适用于RSA加密

我的代码如下。首先,在功能组件中使用useEffect,这会导致Fire.get运行一次:

const ConvoScreen = ({route, navigation}) => {

  const { recipientId, title } = route.params;

  useEffect(() => {
    Fire.get(recipientId, message => {
      return setMessages((previous) => (GiftedChat.append(previous, message)))
    });
    return () => {
      Fire.off(recipientId);
    }
  }, []);

...
然后,在Fire.get中,添加“child_added”事件侦听器:

  get = (fromId, callback) => {
    this.getConvo(fromId).on('child_added', async (snapshot) => {
      const callbackWith = await this.parse(snapshot);
      callback(callbackWith);
    });
  };
此事件触发要运行的解析函数。此处的catch块仅在为树中现有子级运行的“child_added”的初始触发器上达到:

  parse = async message => {
    try {
      const {key: _id} = message;
      const {user, timestamp, text, signature} = message.val();
      const createdAt = new Date(timestamp);

      // IllegalBlockSizeException thrown from native code on this line
      // But only on the initial triggers of 'child_added' and not subsequent triggers
      const decryptedText = await RSAKeychain.decrypt(text, keyTag);

      return {
        _id,
        createdAt,
        text: decryptedText,
        user
      };

    } catch (err) {
      console.log("PARSE ERROR ENCOUNTERED!");
      console.log(err.message);
      // The message is always "Error not specified."
    }
  };
当将完全相同的数据传递到snapshot变量时,解密工作正常。如有任何调查方面的帮助或建议,将不胜感激。我已经用尽了我的能力

编辑:我设法获得了一些堆栈跟踪信息:

 LOG  javax.crypto.IllegalBlockSizeException
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:519)
        at javax.crypto.Cipher.doFinal(Cipher.java:1741)
        at com.RNRSA.RSA.decrypt(RSA.java:148)
        at com.RNRSA.RSA.decrypt(RSA.java:156)
        at com.RNRSA.RNRSAKeychainModule$5.run(RNRSAKeychainModule.java:128)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
Caused by: android.security.KeyStoreException: Unknown error
        at android.security.KeyStore.getKeyStoreException(KeyStore.java:697)
        at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
        ... 8 more

以下问题可能与此相关:以下android tracker问题也提供了一些有限的洞察力:以下问题可能与此相关:以下android tracker问题也提供了一些有限的洞察力: