0

以下の方法を使用してiOSで文字列を暗号化しています


-(NSString *) encrypt:(NSString *) data 
{

    const void *vplainText;
    size_t plainTextBufferSize = [data length];
    vplainText = (const void *) [data UTF8String];
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};

    NSString *key = @"complexkey";
    const void *vkey = (const void *) [key UTF8String];

    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithmDES,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       vkey,
                       kCCKeySizeDES,
                       iv,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [myData base64Encoding];

    // url encode the result
    return (__bridge NSString *) CFURLCreateStringByAddingPercentEscapes(NULL,
                                        (__bridge CFStringRef) result,
                                        NULL,
                                        (__bridge CFStringRef) @"!*'();:@&=+$,/?%#[]",
                                        kCFStringEncodingUTF8);
}

そして、phpでは、次のように文字列を復号化しています-


$decrypted = mcrypt_decrypt(MCRYPT_DES, 'complexkey', base64_decode(urldecode($encrypted)), MCRYPT_MODE_ECB);

これは75%の確率で正しく機能しているようで、他のときに失敗する理由はわかりません。手がかりはありますか?助けてくれてありがとう!

4

2 に答える 2

0

それはおそらくパディングであり、2 つのメソッド間で同期されていない唯一のものです。残念ながら、そのライブラリは PKCS#5 パディング (PKCS#7 パディングと同じ) を実行しないため、独自のアンパディング フォーム mcrypt を作成する必要がある場合があります。幸いなことに、これはかなり単純です。復号化してから、最後のバイトの値を使用して最後のバイトを取り除きます。

その他のセキュリティ関連のメモ:

  • DES は安全ではありません。少なくとも 3DES (または正式には TDEA) を使用してください。
  • ECB モードは安全ではありません。CBC を使用してください (IV を使用します)。
  • ECB モードは IV を使用しません。
  • クライアント/サーバー認証の場合、オラクル攻撃のパディングに注意する必要があります。
于 2012-09-08T12:09:11.933 に答える
0

私が行っていた暗号化/復号化に問題はなかったことがわかりました。むしろ問題は、PHP の urldecode() が '%2B' を '+' に (代わりに ' ' に) デコードしていなかったことです。PHP で urldecode() から rawurldecode() に切り替えたところ、すべて正常に動作しています。

于 2012-09-08T19:30:01.740 に答える