如何在iOS到C#NET之间对AES128进行加密
我尝试在iPhone上使用AES128(CBC模式)进行加密 并使用BASE64发送到Windwos服务器上的ASPX(获取参数), Windwos服务器(C#.NET)上的加密和解密 我在iPhone应用程序和由openssl命令制作的ASPX上有相同的密钥和IV 问题是无法在ASPX上解密 这是我的iOS来源如何在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 {
- (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
- 问题中未显示测试数据或结果
- 每一步都要记录
- 从easy platform上的一个非常简单的案例开始:
- 使用数据,最好是来自两侧完全相同的文件,这样可以消除测试数据的转换和显示问题
- 使用简单的全尺寸键,全尺寸iv,正好一个块大小的数据, 没有填充物
- 在最简单的情况下,开始增加复杂性 一步一个脚印
数据不必使用字符,只需使用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类上使用类别。