[英]Share and store RSA - public key in java server and vice versa
我的要求是:
要求1:將公鑰共享給java服務器。
腳步:
要求2:存儲java服務器發送的公鑰。
腳步:
通過使用SecKeyWrapper類(CommonCrypto示例)中定義的以下方法,我能夠在需求1中實現步驟1-2:
- (void)generateKeyPair:(NSUInteger)keySize
問題1:現在的問題是 - 如何將該密鑰發送到Java服務器?
我們在同一個類中有getPublicKeyBits
方法,它返回一個NSData對象,在一些谷歌搜索中我發現它是DER編碼格式。
問題2:如果我將相同的NSData對象發送到服務器,我猜它將被解釋為ByteBuffer對象,是否可以將其他設備(在我的情況下可能是android)解釋為該數據?
問題3:在上述場景中共享公鑰的最佳方式是什么?
這是我現在想要實現的目標:
方法#1: 嘗試從指數和模數生成公鑰
Android結束
iOS結束
Android結束
問題:
獲取錯誤 - RSA塊的數據太多
方法#2 :( 從這個鏈接知道 - https://github.com/superwills/iOSRSAPublicKeyEncryption ,我們不應該從證書以外的任何東西加載iOS中的公鑰,所以嘗試了不同的方法)
終端
iOS結束
在代碼下方用於加密數據:
SecKeyWrapper * secKeyWrapper = [SecKeyWrapper sharedWrapper]; SecKeyRef獲得PublicKey = [secKeyWrapper getPublicKeyRefFromDerCertificate:kCertificatePath]; NSData * dataToBeEncrypted = [kStringToBeEncrypted dataUsingEncoding:NSUTF8StringEncoding]; NSData * encryptedText = [secKeyWrapper wrapSymmetricKey:dataToBeEncrypted keyRef:acquiredPublicKey];
將NSData轉換為base64encoded字符串
終端
在命令下方用於將其轉換回原始字符串:
回聲| 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.