我想在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的安全框架,似乎真的是很糟糕
你說輸出「搞砸了」。請具體說明。第一個字節是否正確? –
如果您沒有正確管理密鑰,所有這些加密都是無用的。以明文傳輸公鑰可以實現中間人攻擊。爲了防止這種情況,您需要使用TLS(https),在這種情況下,您已經擁有安全的通信通道,並且不需要任何自定義加密。 – ntoskrnl
@Markus不是所有字節都不相同。另外我得到256字節,而java加密和解密後的數據只有字符串一樣長 – Haschmi