0

我正在实现兼容的二进制文件加密/解密.NET and Objective-C apps。我正在使用RNCryptor包装Objective-C。据我所知,我可以encrypt/decrypt字符串,但文件加密让我很困扰。问题是,当我读取文件并加密其数据并将其写入文件时,它不会在.NET app. 如果我计算加密数据的 Base64 字符串并在 .NET 中解密它 - 从 Base64 字符串创建字节数组并使用与文件相同的登录名解密,它会解密。Objective C and .NET在CryptoStream中将加密数据写入文件有什么区别?

还是我缺少一些基本的东西?在目标 C 中加密文件的代码是:-

  RNEncryptor *encryptor = [[RNEncryptor alloc] initWithSettings:kRNCryptorAES256Settings
                                                          password:password
                                                           handler:^(RNCryptor *cryptor, NSData *data) {
                                                               @autoreleasepool
                                                               {
                                                                   NSLog(@"6length of out data %d",[data length]);

                                                                   [encodedText appendString:[data base64EncodingWithLineLength:0]];
                                                                   [outputStream write:data.bytes maxLength:data.length];

                                                                   dispatch_semaphore_signal(semaphore);

                                                                   data = nil;
                                                                   if (cryptor.isFinished)
                                                                   {

                                                                       [outputStream close];
                                                                       NSLog(@"my encryptedText  %@",encodedText);
                                                                       encryptionError = cryptor.error;
                                                                       // call my delegate that I'm finished with decrypting
                                                                   }
                                                               }
                                                           }];
    encryptor.filesize=[attrs fileSize];
    while (inputStream.hasBytesAvailable)
    {
        @autoreleasepool
        {
            uint8_t buf[blockSize];
            NSUInteger bytesRead = [inputStream read:buf maxLength:blockSize];
            if (bytesRead > 0)
            {
                NSData *data = [NSData dataWithBytes:buf length:bytesRead];

            }
                total = total + bytesRead;
                [encryptor addData:data];

                dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            }
        }
    }

    [inputStream close];

    [encryptor finish];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}

解密

[encodedText appendString:[data base64EncodingWithLineLength:0]];

总是有效,但文件不解密。

4

2 回答 2

1

更新:

RNEncryptor 实际上是一个用于正确执行 aes 的高级加密 api,虽然它具有 adhoc 密文格式,但它是典型的构造。要将您的 dotnet 代码与它的 adhoc 格式匹配,您必须使用RNCryptor keyForPassword:salt:settings:匹配RNCryptorKeyDerivationSettings您的 Rfc2898DeriveBytes。如:

   {
    .keySize = kCCKeySizeAES256,
    .saltSize = 16,
    .PBKDFAlgorithm = kCCPBKDF2,
    .PRF = kCCPRFHmacAlgSHA1,
    .rounds = 1000
   }

RNCryptorEngine用于您的 aes 加密,并布局与您的 adhoc .net 格式匹配的密文。

| IV (16 bytes) | Password Salt (16 bytes) | Ciphertext |

这是假设明文也已经采用正确的格式

| message length (8 bytes) | const tag of some sort (8 bytes) | message | sha256 hash of message (32 bytes) |

如果您也需要制作纯文本格式,您可能只想直接使用 iOS 的内置CCCryptor程序而不是 RNCryptor(我猜您会这样做)。

咨询:

为了其他遇到此问题的人的利益,张贴者的 .net 密文结构存在安全问题,请勿使用它。

上一个答案

RNCryptor 进行经过身份验证的加密。

它实际上应该与我的代码兼容: Modern Examples of Symmetric Authenticated Encryption of a string (C#)

然后解密,使用 RNEncryptor 生成的内容,使用:

var plainText = AESThanHmac.SimpleDecryptWithPassword(encryptedMessage, password, nonSecretPayloadLength: 2);

是 2,因此nonSecretPayloadLength它将跳过RNEncryptor Header的版本/选项。

于 2013-09-03T19:14:24.610 回答
0

Base64 encoding needs input size to be multiple of 3 (it transforms each 3 bytes to 4 chars). If it is not, it adds padding ('=' symbols), which will not be processed in stream.

于 2013-09-03T11:26:30.630 回答