如何使iOS设备AES128到C#.NET中的加密 [英] How to make a encryption of AES128 between iOS to C# .NET
问题描述
我尝试在iPhone上使用AES128(CBC模式)加密,使
并采用BASE64发送到ASPX(GET参数)的Windwos Server上,
解密的Windwos服务器(C#.NET)上
I try to make Encryption using AES128(CBC Mode) on iPhone and send to ASPX(GET parameter) on Windwos Server using BASE64, and Decryption on Windwos Server(C# .NET)
我对iPhone应用程序和ASPX由OpenSSL的命令做相同的密钥和IV。
I have same KEY and IV on iPhone app and ASPX made by openssl command.
问题是在ASPX无法进行解密。
The problem is can't decryption on 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]);
我只是想知道什么是C#加密的iOS加密不同。
I just wanna know what is different between iOS Encryption to C# Encryption.
请给我这个问题的一些信息。
Please give me some information of this problem.
谢谢!
推荐答案
AES iOS上符合标准,因为我敢肯定,C#确实还有,不同的是在使用(你code)。
AES on iOS meets the standard as I'm sure C# does as well, the difference is in the usage (your code).
只是为了在你的榜样起动
Just for starters in your example
- 的关键是256位,应该是128位
- IV是248比特,它应该是128位
- 提供的密钥大小
kCCBlockSizeAES128
应该是kCCKeySizeAES128
- 无实验数据或结果显示在这一问题。
最常见的问题是:
- AES适用于数据和许多用途有字符串作为输入和/或输出。
- 的字符串很多时候不是ASCII所以有可能是编码的问题,如UTF8 VS UTF16。
- 不同的数据填充。
- 尺寸不正确密钥和/或IV一些系统垫(嗨PHP)。
- pre和岗位编码,如Base64编码的组合
建议:
- 的NSLog的每一步。
- 开始与易平台非常简单的例子:
- 使用数据,$ P从一个文件,是双方完全相同的pferably $,这消除了测试数据的转换和显示问题。
- 使用简单的全尺寸键,全尺寸四,整整一个街区大小的数据,
没有填充。 - 最简单的情况开始工作的复杂性增加
一步一个脚印的时间。
最后,加密安全只需要一个错误以被突破,开采和包括密钥管理整个系统的意思。让你设计一个领域的专家审查,我做的。最好的是有一个领域的专家创建安全计划并编写code。
Finally, security with encryption only needs one bug to be broken and exploitable and that means in the entire system including key management. Get you design reviewed by a domain expert, I do. Best yet have a domain expert create the security scheme and write the code.
最好不要加上NSData的类别,但如果你做preFIX方法名。结果
它是没有必要使用字符的数据,只是使用NSData的,例如:
Best not to add categories on NSData, but if you do prefix the method names.
It is not necessary to use chars for the data, just use NSData, ex:
+ (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;
}
这篇关于如何使iOS设备AES128到C#.NET中的加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!