簡體   English   中英

共享和存儲RSA - java服務器中的公鑰,反之亦然

[英]Share and store RSA - public key in java server and vice versa

我的要求是:

要求1:將公鑰共享給java服務器。

腳步:

  1. 在iOS應用中生成公鑰 - 私鑰。
  2. 將生成的密鑰存儲在鑰匙串中。
  3. 將生成的公鑰發送到java服務器。
  4. Java服務器應該能夠在數據庫中存儲共享公鑰。

要求2:存儲java服務器發送的公鑰。

腳步:

  1. Java服務器發送其他用戶的公鑰。
  2. 處理java服務器發送的數據並從中生成公鑰。
  3. 將生成的密鑰存儲在密鑰鏈中,以后可以檢索該密鑰以加密要傳輸的消息。

通過使用SecKeyWrapper類(CommonCrypto示例)中定義的以下方法,我能夠在需求1中實現步驟1-2:

- (void)generateKeyPair:(NSUInteger)keySize

問題1:現在的問題是 - 如何將該密鑰發送到Java服務器?

我們在同一個類中有getPublicKeyBits方法,它返回一個NSData對象,在一些谷歌搜索中我發現它是DER編碼格式。

問題2:如果我將相同的NSData對象發送到服務器,我猜它將被解釋為ByteBuffer對象,是否可以將其他設備(在我的情況下可能是android)解釋為該數據?

問題3:在上述場景中共享公鑰的最佳方式是什么?

這是我現在想要實現的目標:

方法#1: 嘗試從指數和模數生成公鑰

Android結束

  1. 在Android設備上生成公鑰和私鑰(使用openssl包裝器)
  2. 從生成的公鑰獲得模數和指數

iOS結束

  1. 使用此鏈接中指定的代碼在ios端生成來自模數和指數的公鑰: https//stackoverflow.com/a/10643962/217586
  2. 使用NSUTF8StringEncoding將一些示例字符串轉換為NSData的對象
  3. used - wrapSymmetricKey:keyRef:在SecKeyWrapper類(CryptoExercise示例)中定義的用於加密的方法,並將從步驟1獲得的密鑰和從步驟2獲得的數據傳遞給它
  4. 將前一步驟中獲得的NSData(加密數據)轉換為base64encoded字符串,與android人員共享相同內容

Android結束

  1. 試圖使用相關的私鑰解密base64encoded字符串

問題:

獲取錯誤 - RSA塊的數據太多

方法#2 :( 從這個鏈接知道 - https://github.com/superwills/iOSRSAPublicKeyEncryption ,我們不應該從證書以外的任何東西加載iOS中的公鑰,所以嘗試了不同的方法)

終端

  1. 使用此URL中指定的openssl命令生成證書: https//stackoverflow.com/a/17295321/217586

iOS結束

  1. 獲取上述url中指定的公鑰
  2. 在代碼下方用於加密數據:

    SecKeyWrapper * secKeyWrapper = [SecKeyWrapper sharedWrapper]; SecKeyRef獲得PublicKey = [secKeyWrapper getPublicKeyRefFromDerCertificate:kCertificatePath]; NSData * dataToBeEncrypted = [kStringToBeEncrypted dataUsingEncoding:NSUTF8StringEncoding]; NSData * encryptedText = [secKeyWrapper wrapSymmetricKey:dataToBeEncrypted keyRef:acquiredPublicKey];

  3. 將NSData轉換為base64encoded字符串

終端

  1. 在命令下方用於將其轉換回原始字符串:

    回聲| openssl rsautl -decrypt -inkey rsaPrivate.pem

問題:

獲取錯誤 - rsa例程:RSA_EAY_PRIVATE_DECRYPT:大於mod len的數據:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/rsa/rsa_eay.c

有什么建議么?

您的第一種方法幾乎與我之前在項目中使用的方法相同。 區別在於我沒有共享模數和指數,而是整個公鑰在base 64中編碼(沒有----- BEGIN / END PUBLIC KEY -----頁眉/頁腳),來回轉換為最終設備中的相應類。 基本上相同的概念應用於加密數據,始終共享Base64編碼數據以避免轉換問題。 到目前為止,如果您沒有任何轉換問題,您的方法應該沒問題(並且您可以通過將公鑰轉換為其base64表示輕松找到問題,在Android和iOS上,字符串應該完全相同,否則發生了一些不好的事情)。 getting error - too much data for RSA block的問題( getting error - too much data for RSA block )是因為您加密的文本對於您提供的密鑰大小而言太大。 RSA只能加密比密鑰對的模數短幾個字節的消息,從而加錯。 您應該做的是,生成一次性加密對稱密鑰,用於加密/解密數據,交換使用對稱密鑰加密的數據和使用RSA加密的密鑰。 這就是任何正確設計的RSA加密方案的工作原理。

無論如何,我認為如果你嘗試使用較短的固定字符串的第一種方法,你應該觀察到第一種方法可能正常工作(除非你實現了錯誤,正如你所解釋的那樣理論上是正確的,但如果沒有看到一些代碼就很難分辨)。

安東尼奧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM