Android 为什么本机rsa本机解密有时才起作用?
我正在编写一个端到端加密的聊天应用程序,至少花了一天时间解决这个问题。我使用的是react native rsa native,并且在消息解密方面遇到了一个问题,我似乎在任何地方都找不到相关文档 在屏幕加载时,使用useEffect调用,这将调用一个函数,该函数在正确的Firebase子级上注册对“child_added”事件的回调。回调反过来运行一个函数,对从Firebase检索到的消息进行解密 根据Firebase文档,此回调有两种不同的运行方式。一种方法是在页面加载时,对Firebase树的选定位置中的每个现有子级运行一次回调。然后,每次出现新的子对象时,该函数都会运行一次 使这个问题如此混乱的是,解密程序只在前一种情况下失败。当屏幕加载时,函数的初始运行(传入所有正确的数据)会导致RSAKeychain.decrypt(文本,keyTag);在没有提供其他消息的情况下抛出IllegalBlockSizeException。我知道这种问题甚至不应该适用于RSA加密 我的代码如下。首先,在功能组件中使用useEffect,这会导致Fire.get运行一次: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树
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问题也提供了一些有限的洞察力: