首页 > 解决方案 > 在 Android、iOS 和 Java (SPRING) 服务器上支持 RSA 加密

问题描述

我们有一个系统,其中包括 Android 和 iPhone 应用程序以及后端服务器。应用程序可以相互发送某些敏感信息。为了做到这一点,他们在登录时生成一个密钥对并将公钥发送到服务器。然后,服务器使用该公钥加密敏感数据,只有接收应用程序才能使用其私钥对其进行解密。我们目前已为 Android 启动并运行它,但在 iPhone 上遇到问题。我已经看了一遍,看到了一些建议,但似乎无法解决它。

公钥作为 base64 编码字符串发送到服务器并存储在服务器上,供服务器端使用

byte[] publicKeyBytes = Base64.decodeBase64(base64EncodedPublicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(rawStringToEncrypt.getBytes("UTF-8"));

这适用于 iOS 和 Android。在 iOS 上生成公钥时,我们需要在将其发送到服务器之前手动添加 ASN1 标头等。但是服务器现在接受从 iOS 发送的密钥并使用它们进行加密(那里一切看起来都不错)。当 Android 应用程序接收到加密数据时,它只会执行

byte[] privateKeyBytes = Base64.decodeBase64(base64EncodedPrivateKey.getBytes("UTF-8"));
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
String decryptedString = new String(cipher.doFinal(toDecrypt), "UTF-8");
return decryptedString;

它从生成其密钥对时获得的存储的 base64 字符串创建其私钥。然而,对于 iOS,我们尝试了大量不同的解决方案,但始终无法解密服务器使用我们的公钥加密的数据。我们生成 KeyPair,操作公钥,以便我们可以将其发送到服务器,然后存储我们的私钥。我们从我们的钥匙串中获取 SecKeyRef(也尝试将其存储为字节并从字节创建它)并SecKeyDecrypt使用该密钥执行并测试kSecPaddingPKCS1kSecPaddingNone.

有没有人有一个可行的解决方案来解密Java服务器按照我描述的方式加密的数据?

标签: javaandroidioscross-platformrsa

解决方案


推荐阅读