Objective-C (iOS) で文字列を暗号化し、Java で HTTP 転送後に復号化したいと考えています。
公開鍵は Java から iOS に正常に送信されました (少なくともキーチェーンで認識されます)。
ObjC では、これを使用してテキスト「Hallo」を送信しようとしています。
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 経由でエンコードされた base64 で、これを使用する Java サーブレットに送信されます (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);
as new String(myData, "UTF-8"); として使用しようとすると、出力が完全に台無しになります。「Hallo」だけを暗号化せずに送信してみましたが、これは動作するので、base64 は問題ないようです。Java で同じフレーズを直接暗号化すると、出力は ObjC 暗号化とは 2 バイト異なります。
最後に、なしではなく OAEP パディングを使用したい...
誰かがこれを手伝ってくれることを願っています.iOSセキュリティフレームワークは本当に悪いようです.