2

コマンドライン openssl を使用して、次の目的の c 暗号化方法と同じ結果を得るにはどうすればよいですか?

- (NSData *)AES256EncryptWithKey:(NSString *)key {
    NSData *returnData = nil;

    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          NULL,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        returnData  = [[NSData alloc] initWithBytes:buffer length:numBytesEncrypted];
    }

    free(buffer);

    return returnData;
}

次のものを(-nosaltの有無にかかわらず)試しましたが、失敗しました:

openssl aes-256-ecb -nosalt -in original.txt -out encrypted.txt
openssl aes-128-ecb -nosalt -in original.txt -out encrypted.txt
4

1 に答える 1

3

可能かもしれませんが、すべきではありません。この ObjC 暗号化コードは非常に壊れています。キーが正しく作成されていないため、OpenSSL で問題が発生しています (キーの作成も不十分ですが、別の方法でより適切に作成されます)。OpenSSL と互換性のある ObjC 暗号化モジュールが必要な場合は、この問題を処理するように設計されたRNCryptorを参照してください。可能であれば、OpenSSL は避けたいと思いますが、現在のところ、私が推奨する単純なコマンドラインの代替品はありません。

この ObjC コードが壊れている理由と、OpenSSl の aes 暗号化ルーチンの問題については、RNCryptor のドキュメントを参照してください。

于 2012-09-02T23:56:46.127 に答える