如何使iOS设备AES128到C#.NET中的加密 [英] How to make a encryption of AES128 between iOS to C# .NET

查看:240
本文介绍了如何使iOS设备AES128到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

  • 无实验数据或结果显示在这一问题。

最常见的问题是:


  1. AES适用于数据和许多用途有字符串作为输入和/或输出。

  2. 的字符串很多时候不是ASCII所以有可能是编码的问题,如UTF8 VS UTF16。

  3. 不同的数据填充。

  4. 尺寸不正确密钥和/或IV一些系统垫(嗨PHP)。

  5. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆