在iOS上生成匹配的RSAPublicKey以匹配来自Android的共享RSAPublicKey(或组件)

时间:2014-06-13 16:15:19

标签: java android ios rsa keychain

我正在尝试在iOS上生成匹配的公钥,以存储来自Android的共享公钥,以进行非对称密钥加密操作。什么是从Android共享公钥的最佳方式,以便可以在iOS上重新创建?

我使用Apple的SecKeyWrapper类使用addPublicKey:keyBits:方法创建publicKey。虽然secItemAdd似乎是成功的,但它始终无法从SecItemMatching()返回生成的PublicKeyRef,因为它总是为零,尽管状态是成功的。 面对与下面链接中讨论的完全相同的行为:(但是,建议的解决方案也不起作用): iOS keychain issue. SecKeyRef always is null as result of SecItemCopyMatching()

我尝试了以下方法:

方法#1。Android:提取模数&来自RSAPublicKey的指数,分别编码为Base64Encoding并与iOS共享。 iOS:从共享的Modulus& amp;创建相应的NSData组件。 exponent并使用SCZ-BasicEncodingRules类的berData操作创建密钥数据对象,以创建原始密钥对象并与SecKeyWrapper共享此输出以生成密钥。

方法#2。Android:提取模数&来自RSAPublicKey的指数,分别编码为UTF8Encoding并与iOS共享。 iOS:从共享的Modulus& amp;创建相应的NSData组件。 exponent并使用SCZ-BasicEncodingRules类的berData操作创建密钥数据对象以创建原始密钥对象并与SecKeyWrapper共享此输出以生成密钥。 参考:https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS

或者,也尝试使用CryptoUtil类从Modulus&amp ;;生成KeyObject。指数,它产生完全相同的行为。

方法#3。Android:在RSAPublcKey上调用.toString()并将输出字符串编码为base64Encoding并与iOS共享。 iOS:从base64Encoded密钥创建NSData,并与SecKeyWrapper共享此输出以生成密钥。这是agin得到的结果!

方法#4。Android:在RSAPublcKey上调用.toString()并将输出字符串编码为base64Encoding并与iOS共享。 iOS:试图使用wingsofhermes描述的方法创建KeyData对象,无论如何都会立即以错误的格式返回false。

话虽如此,我无法区分输入密钥数据是否出错或密钥生成@ iOS是否出错。 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

经过深入研究,我发现iOS的secKeyWrapper只能接受ASN.1 DER格式的密钥数据。 任何以任何其他格式传递数据的尝试都肯定会在iOS上失败。

通过以PEM格式转储RSA密钥解决了这个问题,并使用以下链接的方法读取PEM并转换为ASN.1 DER格式并将其传递给SecKeyWrapper! http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/

替代方法: 通过使用iOS的OpenSSL库(参考Generate Public Key From Modulus & Exponent on iOS using OpenSSL)并创建具有输入模数和放大器的RSA对象,也可以解决问题。从任何其他平台共享的公钥的exponent(base64encoded)数据。