如何在iOS到C#NET之间对AES128进行加密

如何在iOS到C#NET之间对AES128进行加密,c#,asp.net,ios,encryption,C#,Asp.net,Ios,Encryption,我尝试在iPhone上使用AES128(CBC模式)进行加密 并使用BASE64发送到Windwos服务器上的ASPX(获取参数), Windwos服务器(C#.NET)上的加密和解密 我在iPhone应用程序和由openssl命令制作的ASPX上有相同的密钥和IV 问题是无法在ASPX上解密 这是我的iOS来源 - (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv {

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

我在iPhone应用程序和由openssl命令制作的ASPX上有相同的密钥和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#加密有什么不同

请给我一些关于这个问题的信息


谢谢

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

在你的例子中,这只是一个开始

  • 密钥是256位,应该是128位
  • iv是248位,应该是128位
  • 提供的密钥大小是
    kCCBlockSizeAES128
    它应该是
    KCCKysizeAES128
  • 问题中未显示测试数据或结果
最常见的问题是:

  • AES处理数据,许多用法都使用字符串作为输入和/或输出
  • 字符串很多时候不是ascii码,因此可能存在编码问题,例如UTF8与UTF16
  • 数据的不同填充
  • 某些系统填充的键和/或iv大小不正确(Hi php)
  • 预编码和后编码的组合,如Base64
  • 建议:

    • 每一步都要记录
    • 从easy platform上的一个非常简单的案例开始:
    • 使用数据,最好是来自两侧完全相同的文件,这样可以消除测试数据的转换和显示问题
    • 使用简单的全尺寸键,全尺寸iv,正好一个块大小的数据, 没有填充物
    • 在最简单的情况下,开始增加复杂性 一步一个脚印
    最后,加密的安全性只需要一个bug就可以被破解和利用,这意味着整个系统包括密钥管理。让你的设计得到领域专家的审核,我会的。最好让领域专家创建安全方案并编写代码

    最好不要在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;
    }
    

    AES128Operation:
    是NSData上的一个类别吗?为什么?至少为所有类别方法指定一个唯一的前缀。最好不要在API类上使用类别。