-1

CommonCrypto CCCryptorCreate を使用してメッセージを復号化しています。パスワードと IV を使用していますが、常に nil が返されます。

CCCryptorCreate を使用して復号化しますが、RUBY 側での暗号化中に IV を使用せず、obj-c 復号化側で IV を使用しない場合、復号化は完全に機能し、メッセージを確認できます。

しかし、RUBY で IV を使用し、obj-c 側で IV を使用すると、復号化は nil メッセージ オブジェクトで終了します。

私はこのEncrypt in Objective-C / Decrypt in Ruby を何かを使用して使用しています

OBJ-C メソッド:

    - (NSData *) decryptedDataUsingAlgorithm: (CCAlgorithm) algorithm
                                         key: (id) key      // data or string
                        initializationVector: (id) iv       // data or string
                                     options: (CCOptions) options
                                       error: (CCCryptorStatus *) error
    {
        CCCryptorRef cryptor = NULL;
        CCCryptorStatus status = kCCSuccess;

        NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
        NSParameterAssert(iv == nil || [iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);

        NSMutableData * keyData, * ivData;
        if ( [key isKindOfClass: [NSData class]] )
            keyData = (NSMutableData *) [key mutableCopy];
        else
            keyData = [[key dataUsingEncoding: NSUTF8StringEncoding] mutableCopy];

        if ( [iv isKindOfClass: [NSString class]] )
            ivData = [[iv dataUsingEncoding: NSUTF8StringEncoding] mutableCopy];
        else
            ivData = (NSMutableData *) [iv mutableCopy];    // data or nil

        #if !__has_feature(objc_arc)
            [keyData autorelease];
            [ivData autorelease];
        #endif

        // ensure correct lengths for key and iv data, based on algorithms
        FixKeyLengths( algorithm, keyData, ivData );

        status = CCCryptorCreate( kCCDecrypt, algorithm, options,
                               [keyData bytes], [keyData length], [ivData bytes],
                               &cryptor );

        if ( status != kCCSuccess )
        {
            if ( error != NULL )
                *error = status;
            return ( nil );
        }

        NSData * result = [self _runCryptor: cryptor result: &status];
        if ( (result == nil) && (error != NULL) )
            *error = status;

        CCCryptorRelease( cryptor );

        return ( result );
    }




=== DOES NOT WORK ====
NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128
                                                key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash]
                               initializationVector: [anIV dataUsingEncoding:NSUTF8StringEncoding]
                                            options: kCCOptionPKCS7Padding
                                              error: &status];


=== DOES WORK ===
NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128
                                                key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash]
                               initializationVector: nil
                                            options: kCCOptionPKCS7Padding
                                              error: &status];
4

1 に答える 1

0

iv が異なる可能性があるようです。データ バイトが同じで、長さが正しいことを確認してください。

CCCryptワンショット暗号化を行いたい。

Apple から:CCCryptステートレスなワンショットの暗号化または復号化操作です。これは基本的にCCCrytorCreate()CCCryptorUpdate()CCCryptorFinal()、のシーケンスを実行しますCCCryptorRelease()

使用していないのでCCCrypt、少なくともCCCryptorFinal()例に追加する必要があります。

また、キーと iv は正確に正確なバイト単位のサイズである必要があることに注意してください。NSUTF8StringEncoding複数バイトのエンコーディングを必要とする文字がある場合、を使用しても期待されるバイト数が生成されない場合があります。注: 「i」はサロゲート ペアとしてエンコードできます。

PBKDF2適切なキーを生成するために使用せずにパスワード文字列を使用しないでください。

暗号で何をしているのか本当にわからない限り、 RNCryptor の使用を検討してください。

これは、ワンショット暗号化/復号化方法の簡単なコード例です
。キーと iv は、必要な長さである必要があります。
エンコーディング (Base64、NSString など) は、このメソッドの外で行われます。

+ (NSData *)doCipher:(NSData *)dataIn
                  iv:(NSData *)iv
                 key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
               error:(NSError **)error
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( encryptOrDecrypt,
                       kCCAlgorithmAES128,
                       kCCOptionPKCS7Padding,
                       symmetricKey.bytes, 
                       kCCKeySizeAES128,
                       iv.bytes,
                       dataIn.bytes,
                       dataIn.length,
                       dataOut.mutableBytes,
                       dataOut.length,
                       &cryptBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = cryptBytes;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError"
                                         code:ccStatus
                                     userInfo:nil];
        }
        dataOut = nil;
    }

    return dataOut;
}
于 2014-06-27T20:01:13.127 に答える