在java服务器中共享和存储RSA公钥,反之亦然



我的要求是:

需求1:向java服务器共享公钥

步骤:

  1. 在iOS应用中生成公私钥对。
  2. 将生成的密钥存储在keychain中
  3. 将生成的公钥发送到java服务器。
  4. Java服务器应该能够在数据库中存储共享公钥。

需求2:存储java服务器发送的公钥。

步骤:

  1. Java服务器发送其他用户的公钥。
  2. 处理java服务器发送的数据并生成公钥。
  3. 将生成的密钥存储在keychain中,稍后可以检索该密钥以加密要传输的消息。

我能够通过使用以下在SecKeyWrapper类(CommonCrypto示例)中定义的方法来实现需求1中的步骤1-2:

- (void)generateKeyPair:(NSUInteger)keySize

问题1:现在的问题是-我如何将密钥发送到java服务器?

我们有getPublicKeyBits方法在同一个类,它返回一个NSData对象,在一些谷歌我发现它是在DER编码格式。

问题2:如果我发送相同的NSData对象到服务器,我猜它会解释为ByteBuffer对象,是否有可能为其他设备,在我的情况下,它可能是android,解释该数据?

问题3:在上述场景中,共享公钥的最佳方式是什么?

这就是我现在想要达到的目标:

方法#1: 尝试从指数和模数

生成公钥<

Android结束/strong>

  1. 在android设备上生成公钥和私钥(使用openssl包装)
  2. 从生成的公钥中获取模数和指数
iOS

  1. 从模数和指数生成公钥,最后使用此连结所指明的代码:https://stackoverflow.com/a/10643962/217586
  2. 将一些示例字符串转换为NSData的对象NSUTF8StringEncoding
  3. Used - wrapSymmetricKey:keyRef: SecKeyWrapper中定义的方法类(CryptoExercise示例)进行加密,并获得传递的密钥从步骤1和从步骤2获得的数据加密到它
  4. 将上一步获得的NSData(加密数据)转换为base64编码的字符串,与android家伙共享相同
<

Android结束/strong>

  • 尝试使用相关私钥解密base64编码的字符串
  • 问题:

    获取错误- RSA块的数据太多

    方法#2: (从这个链接中知道-https://github.com/superwills/iOSRSAPublicKeyEncryption,我们不是应该从a以外的任何地方加载iOS中的公钥证书,所以尝试了不同的方法)

    终端

    1. 使用此url中指定的openssl命令生成证书:https://stackoverflow.com/a/17295321/217586
    iOS

  • 获取的公钥如上述url所示
  • 使用下面的代码加密数据:

    SecKeyWrapper * SecKeyWrapper = [SecKeyWrapper sharedWrapper];SecKeyRef obtainedPublicKey = [secKeyWrapper。getPublicKeyRefFromDerCertificate kCertificatePath):;NSData *dataToBeEncrypted = [kStringToBeEncrypted]dataUsingEncoding NSUTF8StringEncoding):;NSData *encryptedText = [secKeyWrapperwrapSymmetricKey: dataToBeEncrypted keyRef: obtainedPublicKey];

  • 将NSData转换为base64编码的字符串

  • 终端

  • 使用下面的命令将其转换回原始字符串:

    echo | openssl

  • 问题:

    得到错误- rsa例程:RSA_EAY_PRIVATE_DECRYPT:data大于国防部len:/SourceCache OpenSSL098/OpenSSL098 - 47.1/src/加密/rsa/rsa_eay.c

    有什么建议吗?

    您的第一种方法与我以前在一个项目中使用的方法几乎相同。不同之处在于,我没有共享模数和指数,而是共享以base 64编码的整个公钥(没有-----BEGIN/END public key -----头/脚),将其来回转换为终端设备中的适当类。基本上相同的概念应用于加密数据,始终共享Base64编码的数据以避免转换问题。到目前为止,如果你没有任何转换问题,那么你的方法应该是好的(你可以很容易地通过将公钥转换为base64表示来发现问题,在android和iOS上字符串应该完全相同,否则会发生一些不好的事情)。您遇到的问题(getting error - too much data for RSA block)是因为您要加密的文本对于您提供的密钥大小来说太大了。RSA只能加密比密钥对的模数短几个字节的消息,因此会出现错误。您应该做的是,生成用于加密/解密数据的一次性加密对称密钥,交换用对称密钥加密的数据和使用RSA加密的密钥。这大致就是任何正确设计的RSA加密方案的工作原理。

    无论如何,我认为如果你用一个更短的固定字符串尝试你的第一种方法,你应该观察到第一种方法可能是工作的(除非你实现的东西是错误的,因为你解释的是理论上正确的,但很难告诉没有看到一些代码)。

    安东尼奥

    最新更新