2013-07-23 24 views
0

我想在Objective-C(iOS)中對字符串進行加密,並在Java中的HTTP傳輸之後對其進行解密。RSA將iOS傳輸到Java

公共密鑰已成功從Java發送到iOS(至少是在Keychain recognied)

在ObjC我嘗試發送文本「你好」用這樣的:

NSData* myData = [@"Hallo" dataUsingEncoding:NSUTF8StringEncoding]; 
OSStatus status = noErr;  
size_t cipherBufferSize; 
uint8_t *cipherBuffer; 
cipherBufferSize = SecKeyGetBlockSize(publicKey); 
cipherBuffer = malloc(cipherBufferSize);  
size_t dataLength = [self length]; 
uint8_t* intDataToEncrypt = (uint8_t*)[self bytes]; 
if (cipherBufferSize < dataLength) { 
    printf("Could not encrypt. Packet too large.\n"); 
    return NULL; 
} 
status = SecKeyEncrypt( publicKey, 
         kSecPaddingNone, 
         intDataToEncrypt, 
         dataLength, 
         cipherBuffer, 
         &cipherBufferSize 
         ); 
NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize]; 

「的EncryptedData」然後發送通過HTTP POST編碼成的Java Servlet BASE64使用這種(BouncyCastle的用來將數據從Base64的轉換回第一,關鍵是從文件中讀取):

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b64.decodeBuffer(key)); 
PrivateKey privateKey = kf.generatePrivate(keySpec); 
Cipher cipher = Cipher.getInstance("RSA/NONE/NoPadding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] myData = cipher.doFinal(byteData, 0, 256); 

嘗試使用新字符串(myData,「UTF-8」)時輸出完全混亂; 我試過只發送沒有加密的「Hallo」這個工作,所以它似乎base64是好的。 當我直接在Java中加密相同的短語時,輸出與ObjC加密的2字節不同。

在我想用OAEP填充的,而不是沒有結束......

我希望有人能夠幫助這一點,iOS的安全框架,似乎真的是很糟糕

+0

你說輸出「搞砸了」。請具體說明。第一個字節是否正確? –

+0

如果您沒有正確管理密鑰,所有這些加密都是無用的。以明文傳輸公鑰可以實現中間人攻擊。爲了防止這種情況,您需要使用TLS(https),在這種情況下,您已經擁有安全的通信通道,並且不需要任何自定義加密。 – ntoskrnl

+0

@Markus不是所有字節都不相同。另外我得到256字節,而java加密和解密後的數據只有字符串一樣長 – Haschmi

回答

0

,問題並不在RSA部分,但Base64編碼和傳輸。由於HTTP(S)傳輸,字符串中的所有「+」都被接收爲「」(當然,我應該想到這一點)。

用非官方的Base64URL版本提出的「 - 」替換它們解決了這個問題。 (所有「/」都帶「_」)

這也解釋了爲什麼只有2個字節不同 - 這些是「+」符號字節。