0

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セキュリティフレームワークは本当に悪いようです.

4

1 に答える 1

0

問題は RSA 部分ではなく、Base64 エンコーディングと転送にありました。HTTP(S)転送のため、文字列の「+」はすべて「 」として受け取られました(もちろん、私はそれを考える必要がありました)。

非公式の Base64URL バージョンで提案されているように、それらを「-」に置き換えると、問題が解決します。(また、すべて「/」と「_」)

これは、2 バイトだけが異なっていた理由も説明しています。それらは「+」記号のバイトでした。

于 2013-07-27T06:47:21.630 に答える