使用iOs CCCrypt函数使用AES生成的C#解密base64字符串 [英] Decrypt a base64 string using C# generated by iOs CCCrypt function using AES

查看:208
本文介绍了使用iOs CCCrypt函数使用AES生成的C#解密base64字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮助将下面由iOS代码生成的base64字符串解密为等效的C#。

Could someone please help decrypt the base64 string generated by iOS code below into its C# equivalent.

我试图以在秘密位置遇见我结尾

I am trying to end up with "Meet me at the secret location at 8pm" within c#.

iOS生成以下加密:qd + SGaij5KSBScuLs3TpJS / 3Dew8fHTudcs / 5MG7Q1kqcrZzZycMgTcQuEEEED5f

iOS generated the following encryption: qd+SGaij5KSBScuLs3TpJS/3Dew8fHTudcs/5MG7Q1kqcrZzZycMgTcQuEEEED5f

This iOS代码已成功按照XCode 6中的要求对数据进行加密和解密。

This iOS code successfully encrypts and decrypts data as required within XCode 6.

在此先感谢您的帮助和支持。

Thank you in advance for your help and support.

Darren

#import <CommonCrypto/CommonCryptor.h>

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSString *sData = @"Meet me at the secret location at 8pm";
    NSString *sIv = @"4QesEr03HwE5H1C+ICw7SA==";
    NSString *sKey = @"ovA6siPkyM5Lb9oNcnxLz676K6JK6FrJKk4efEUWBzg=";

    NSData *dData = [sData dataUsingEncoding:NSUTF8StringEncoding];
    NSData *dIv = [sIv dataUsingEncoding:NSUTF8StringEncoding];
    NSData *dKey = [sKey dataUsingEncoding:NSUTF8StringEncoding];

    NSData *dEncrypt = [self doCipher:dData iv:dIv key:dKey context:kCCEncrypt];

    NSData *dDecrypt = [self doCipher:dEncrypt iv:dIv key:dKey context:kCCDecrypt];
    NSString *sDecrypt = [[NSString alloc] initWithData:dDecrypt encoding:NSUTF8StringEncoding];
    NSLog(@"Decrypted Data: %@",sDecrypt);
}

- (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);
    }

    dataOut.length = cryptBytes;

    NSString *base64 = [dataOut base64EncodedStringWithOptions:0];
    NSLog(@"%@",base64);

    return dataOut;
}


推荐答案

给定的base64字符串 qd + SGaij5KSBScuLs3TpJS / 3Dew8fHTudcs / 5MG7Q1kqcrZzZycMgTcQuEEEED5f 是一个双向打包。

The given base64 string qd+SGaij5KSBScuLs3TpJS/3Dew8fHTudcs/5MG7Q1kqcrZzZycMgTcQuEEEED5f is a two way pack.

首先必须对base64进行解码(< a href = https://stackoverflow.com/a/7134853/1838048>易于使用C#),然后必须使用正确的算法对其进行解密。从给定的参数来看,它有望使用AES或Rijndael算法(示例代码此处 ),您必须在其中放入base64解码字节,密钥和IV。

First it has to be base64 decoded (which is easy in C#) and afterwards it has to be decrypted by using the correct algorithm. From the given parameters it hopefully uses the AES or Rijndael algorithm (example code here) where you have to put in the base64 decoded bytes, the key and the IV.

在那之后,您希望得到想要的数据。

After that you hopefully get out your desired data.

所以我为自己写了一个示例,并且能够使用C#加密和解密指定的消息。

So i wrote an example on myself and i'm able to encrypt and decrypt the specified message with C#.

检索到的加密消息与iOS生成的消息不同

您的iOS消息: qd + SGaij5KSBScuLs3TpJS / 3Dew8fHTudcs / 5MG7Q1kqcrZzZycMgTcQuEEEED5f
我的C#消息: wC2dn + QVhOhf + NqZVskopLdh2XDAdG3SmczrKF + TjQsGfxu07BEhRdiDqkbGY80O

我刚刚做了一些稍作改动,外观就会更深一些。我看到的一件事是,您在iOS代码中说密钥的长度为256位。但是您提供的密钥只有128位的长度。在这种情况下,C#似乎只需切换回128位密钥长度(因为更改下面代码中的密钥大小不会更改加密字节)。但是也许iOS中的CCCrypt有所不同。因此,要么在您的iOS代码中采用密钥大小,要么提供一个256位密钥,然后再次比较iOS和C#的结果。

I just made some little changes and dit a little deeper look. One thing i see is that you say in your iOS code that the key has a length of 256 bit. But the key you are providing has only a length of 128 bit. It seems that C# in that case simply switches back to 128 bit key length (cause changing the key size in the code below doesn't change the encrypted bytes). But maybe the CCCrypt in iOS makes something different. So either adopt in your iOS code the key size or provider a 256 bit key and than compare the results of iOS and C# again.

示例:

var message = @"Meet me at the secret location at 8pm";
var iv = @"4QesEr03HwE5H1C+ICw7SA==";
var key = @"ovA6siPkyM5Lb9oNcnxLz676K6JK6FrJKk4efEUWBzg=";

byte[] encryptedBytes;

using (var aesCryptoProvider = new AesCryptoServiceProvider())
{
    aesCryptoProvider.BlockSize = 128;
    aesCryptoProvider.KeySize = 256;
    aesCryptoProvider.IV = Convert.FromBase64String(iv);
    aesCryptoProvider.Key = Convert.FromBase64String(key);
    aesCryptoProvider.Padding = PaddingMode.PKCS7;
    aesCryptoProvider.Mode = CipherMode.CBC;

    using (var encryptor = aesCryptoProvider.CreateEncryptor())
    using (var memoryStream = new MemoryStream())
    using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
    using (var streamWriter = new StreamWriter(cryptoStream, Encoding.UTF8))
    {
        streamWriter.Write(message);
        streamWriter.Close();
        encryptedBytes = memoryStream.ToArray();
    }
}

var encryptedMessage = Convert.ToBase64String(encryptedBytes);
Console.WriteLine(encryptedMessage);

using (var aesCryptoProvider = new AesCryptoServiceProvider())
{
    aesCryptoProvider.BlockSize = 128;
    aesCryptoProvider.KeySize = 256;
    aesCryptoProvider.IV = Convert.FromBase64String(iv);
    aesCryptoProvider.Key = Convert.FromBase64String(key);
    aesCryptoProvider.Padding = PaddingMode.PKCS7;
    aesCryptoProvider.Mode = CipherMode.CBC;

    using (var decryptor = aesCryptoProvider.CreateDecryptor())
    using (var memoryStream = new MemoryStream(Convert.FromBase64String(encryptedMessage)))
    using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
    using (var streamReader = new StreamReader(cryptoStream, Encoding.UTF8))
    {
        Console.WriteLine(streamReader.ReadToEnd());
    }
}

这篇关于使用iOs CCCrypt函数使用AES生成的C#解密base64字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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