0

我尝试在 iPhone 上使用 AES128(CBC 模式)进行加密,并使用 BASE64 发送到 Windwos Server 上的 ASPX(GET 参数),并在 Windwos Server(C# .NET)上进行解密

我在 iPhone 应用程序和由 openssl 命令制作的 ASPX 上有相同的 KEY 和 IV。

问题是无法在 ASPX 上解密。

这是我的 iOS 源

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

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

    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

并像这样使用..

    NSString* keyStr = @"898698E7E5E432534B55FC1B18A*****";
    NSString* ivStr = @"FE3E758444C0F2B7EAE8F5771E*****";

    NSString *email_str = [NSString stringWithCString:(char *) [email.text UTF8String] encoding:NSUTF8StringEncoding];
    NSData *emailData = [email_str dataUsingEncoding:NSUTF8StringEncoding];

    NSString *pass_str = [NSString stringWithCString:(char *) [pass.text UTF8String] encoding:NSUTF8StringEncoding];
    NSData *passData = [pass_str dataUsingEncoding:NSUTF8StringEncoding];


    NSData *enEmailData = [emailData AES128EncryptWithKey:keyStr iv:ivStr];
    NSData *enPassData = [passData AES128EncryptWithKey:keyStr iv:ivStr];



    NSLog(@"Email -> %@ : %@", email.text, [enEmailData base64EncodedString]);
    NSLog(@"Pass -> %@ : %@", pass.text, [enPassData base64EncodedString]);

我只想知道 iOS 加密与 C# 加密有什么不同。

请给我一些有关此问题的信息。

谢谢!

4

1 回答 1

0

iOS 上的 AES 符合标准,因为我确信 C# 也符合标准,区别在于用法(您的代码)。

仅作为示例中的初学者

  • 密钥是256位,应该是128位
  • iv是248位,应该是128位
  • 提供的密钥大小kCCBlockSizeAES128应该是kCCKeySizeAES128
  • 问题中未显示任何测试数据或结果。

最常见的问题是:

  1. AES 与数据一起工作,许多用法都将字符串作为输入和/或输出。
  2. 这些字符串很多时候不是 ascii,因此可能存在编码问题,例如 UTF8 与 UTF16。
  3. 数据的不同填充。
  4. 某些系统填充的密钥大小不正确和/或 iv(嗨 php)。
  5. Base64等前后编码的组合

建议:

  • NSLog 在每一步。
  • 从easy平台上的一个非常简单的案例开始:
  • 使用数据,最好来自两边完全相同的文件,这样可以消除测试数据的转换和显示问题。
  • 使用简单的全尺寸密钥,全尺寸 iv,恰好一个块大小的数据,无填充。
  • 从最简单的案例开始,一步一步地增加复杂性。

最后,加密的安全性只需要一个漏洞被破解和利用,这意味着在整个系统中,包括密钥管理。让领域专家对您的设计进行审查,我愿意。最好让领域专家创建安全方案并编写代码。

最好不要在 NSData 上添加类别,但如果您确实为方法名称添加前缀。
数据不必使用字符,只需使用 NSData,例如:

+ (NSData *)doCipher:(NSData *)dataIn
                  iv:(NSData *)iv
                 key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;    // Number of bytes moved to buffer.
    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) {
        NSLog(@"CCCrypt status: %d", ccStatus);
        return nil;
    }
    dataOut.length = cryptBytes;
    return dataOut;
}
于 2013-11-12T13:14:21.710 回答