0

ここには似たような質問と回答がたくさんあることは知っていますが、検索しても自分に合ったものを見つけることができません.

IOS (6) で使用したいサービスがあります。これは、私が制御できないサード パーティによって提供されます。

サービスで認証するには、RSA 公開鍵で暗号化された RSA 暗号化文字列としてユーザー資格情報を送信する必要があります。

次の形式の XML ファイルが提供されました。

<BitStrength>1024</BitStrength>
<RSAKeyValue>
<Modulus>xxxxxxxxxxxxxxxxxxxxx</Modulus>
<Exponent>xxxx</Exponent>
</RSAKeyValue>

文字列を暗号化するにはどうすればよいですか? 私は DOTNET のバックグラウンドを持っているため、これまで複雑さのほとんどはわかりませんでした。

私は次のような例を試しました: Objective C での RSA 実装 ですが、私が持っているものからオブジェクトを構築する方法はありません。証明書が必要なようです。

このツールを使用してPEMファイルに変換しようとしましたが、コードは証明書オブジェクトを構築しません。 https://superdry.apphb.com/tools/online-rsa-key-converter

助けてくれてありがとう。

****編集****これは、提供された例を使用して作成したメソッドの一部です。エラーなしで実行されますが、出力をデコードできません。

   SStatus status = noErr;

size_t cipherBufferSize;
uint8_t *cipherBuffer;

// [cipherBufferSize]
size_t dataSize = [plainTextString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const uint8_t* textData = [[plainTextString dataUsingEncoding:NSUTF8StringEncoding] bytes];

NSAssert(publicKey, @"The public key being referenced by tag must have been stored in the keychain before attempting to encrypt data using it!");

//  Allocate a buffer

cipherBufferSize = SecKeyGetBlockSize(publicKey);
// plain text block size must be 11 less than cipher buffer size because of
// the PKSC1 padding used:
const size_t blockSizeMinusPadding = cipherBufferSize - 11;
cipherBuffer = malloc(cipherBufferSize);

NSMutableData* accumulatedEncryptedData = [NSMutableData dataWithCapacity:0];

for (int ii = 0; ii*blockSizeMinusPadding < dataSize; ii++) {
    const uint8_t* dataToEncrypt = (textData+(ii*blockSizeMinusPadding));
    const size_t subsize = (((ii+1)*blockSizeMinusPadding) > dataSize) ? blockSizeMinusPadding-(((ii+1)*blockSizeMinusPadding) - dataSize) : blockSizeMinusPadding;

    // Encrypt using the public key.
    status = SecKeyEncrypt(publicKey,
                           kSecPaddingOAEP,
                           dataToEncrypt,
                           subsize,
                           cipherBuffer,
                           &cipherBufferSize
                           );

    [accumulatedEncryptedData appendBytes:cipherBuffer length:cipherBufferSize];
}

if (publicKey) CFRelease(publicKey);

free(cipherBuffer);

// 蓄積された暗号化データを返します。[accumulatedEncryptedData base64EncodedString] を返します。

4

2 に答える 2

1

あなたが言及したコンバーターを使用して公開鍵のPEM文字列を取得するか、自分で変換を行うコードを記述してください。

編集:申し訳ありませんが、間違ったリンクを貼り付けました。今変更しました: 次に、ここにあるコードを取得し、それを使用して公開鍵を iOS キーチェーンに追加します。

次のコードを使用して、キーチェーンから公開鍵の参照を取得できます。

+ (SecKeyRef)copyPublicKeyForTag:(NSString*)tag
{
    SecKeyRef publicKey = NULL;

    NSData * publicTag = [NSData dataWithBytes:[tag cStringUsingEncoding:NSUTF8StringEncoding]
                                        length:[tag length]];

    NSMutableDictionary *queryPublicKey =
    [[NSMutableDictionary alloc] init];

    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef];

    OSStatus status = SecItemCopyMatching
    ((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKey);

    if (status != noErr) {
        return nil;
    }

    return publicKey;
}

これで、私が書いたコードを使用して、ここにある公開鍵を使用してデータを暗号化できます。私はPKCS1パディングを使用していますが、そうでない場合があることに注意してください。その場合、コードを iOS 5 で動作させるか、iOS 6 でのみ動作させるかによって、リンク先のブログ投稿の残りの情報が関連するかどうかが決まります。

于 2013-01-30T23:34:41.833 に答える
0

結局、私たちはhttp://chilkatsoft.com/rsa-objc.aspを使用しました。これは完全にシームレスでした。その価格のために、iOS にネイティブで実行させるために、より多くのお金を費やしていました。

モジュラスと指数部、または証明書を取ります。IOS で暗号化した場合、Mathews コードは機能しているように見えましたが、サービスで正常に復号化することはできませんでした。

于 2013-02-26T15:49:57.007 に答える