如何在iOS和C#.NET之间对AES128进行encryption

我尝试使用iPhone上的AES128(CBC模式)进行encryption,然后使用BASE64发送到Windwos服务器上的ASPX(GET参数)以及Windwos服务器上的解密(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]); 

我只是想知道iOSencryption到C#encryption之间有什么不同。

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

谢谢!

在iOS上的AES符合标准,我确信C#也是这样做的,不同之处在于使用(您的代码)。

只是在你的例子中的初学者

  • 密钥是256位,应该是128位
  • iv是248位,应该是128位
  • 提供的密钥大小是kCCBlockSizeAES128它应该是kCCKeySizeAES128
  • 问题中没有显示testing数据或结果。

最常见的问题是:

  1. AES与数据一起工作,并且许多用法具有作为input和/或输出的string。
  2. string很多时候不是ascii,所以可能会有编码问题,如UTF8与UTF16。
  3. 数据的不同填充。
  4. 大小不正确的键和/或四,一些系统垫(Hi php)。
  5. 编码之前和之后的组合,如Base64

build议:

  • NSLog每一步。
  • 在简单的平台上开始一个非常简单的例子:
  • 使用数据,最好来自两侧完全相同的文件,这将消除转换和显示testing数据的问题。
  • 使用简单的全尺寸键,全尺寸四,正好一个块大小的数据,没有填充。
  • 在最简单的情况下,开始逐步增加复杂性。

最后,encryption安全只需要一个缺陷被破解和利用,这意味着整个系统包括密钥pipe理。 让你的devise审查的领域专家,我呢。 最好还有一个领域专家创build安全scheme并编写代码。

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