Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用使用AES的iOs CCCrypt函数生成的C#解密base64字符串_C#_Ios_Encryption_Aes_Commoncrypto - Fatal编程技术网

使用使用AES的iOs CCCrypt函数生成的C#解密base64字符串

使用使用AES的iOs CCCrypt函数生成的C#解密base64字符串,c#,ios,encryption,aes,commoncrypto,C#,Ios,Encryption,Aes,Commoncrypto,有人能帮我把下面的iOS代码生成的base64字符串解密成C#等价物吗 我试图在c#内以“晚上8点在秘密地点见我”结束 iOS生成了以下加密:qd+SGAIJ5KSBCSCLUS3TPJS/3Dew8fHTudcs/5MG7Q1KQCRZZYCMGTCQUEED5F 此iOS代码根据需要在XCode 6中成功加密和解密数据 提前感谢您的帮助和支持 达伦 #import <CommonCrypto/CommonCryptor.h> - (void)viewDidLoad {

有人能帮我把下面的iOS代码生成的base64字符串解密成C#等价物吗

我试图在c#内以“晚上8点在秘密地点见我”结束

iOS生成了以下加密:qd+SGAIJ5KSBCSCLUS3TPJS/3Dew8fHTudcs/5MG7Q1KQCRZZYCMGTCQUEED5F

此iOS代码根据需要在XCode 6中成功加密和解密数据

提前感谢您的帮助和支持

达伦

#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;
}
#导入
-(无效)viewDidLoad{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
NSString*sData=@“晚上8点在秘密地点见我”;
NSString*sIv=@“4QesEr03HwE5H1C+ICw7SA==”;
NSString*sKey=@“ovA6siPkyM5Lb9oNcnxLz676K6JK6FrJKk4efEUWBzg=”;
NSData*dData=[sData数据使用编码:NSUTF8StringEncoding];
NSData*dIv=[sIv数据使用编码:NSUTF8StringEncoding];
NSData*dKey=[sKey DATAUSINGENCODE: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(@“解密数据:%@”,sDecrypt);
}
-(NSData*)doCipher:(NSData*)数据输入
四:(NSData*)四
键:(NSData*)symmetricKey
上下文:(cOperation)encryptOrDecrypt
{
CCCryptorStatus ccStatus=KCCSucces;
size\u t cryptBytes=0;//移动到缓冲区的字节数。
NSMutableData*dataOut=[NSMutableData dataWithLength:dataIn.length+kCCBlockSizeAES128];
ccStatus=CCCrypt(encryptOrDecrypt,
KCcalGorithmae128,
KCCOPIONPKCS7填充,
symmetricKey.bytes,
kCCKeySizeAES128,
iv.字节,
以字节为单位的数据,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&密码字节);
if(ccStatus!=KCCSucces){
NSLog(@“CCCrypt状态:%d”,ccStatus);
}
dataOut.length=cryptBytes;
NSString*base64=[dataOut base64EncodedStringWithOptions:0];
NSLog(@“%@”,base64);
返回数据输出;
}

给定的base64字符串
qd+SGAIJ5KSBCSCLUS3TPJS/3Dew8fHTudcs/5MG7Q1KQCRZZYCMGTCQUEEED5F
是一个双向包

首先必须对其进行base64解码(即),然后必须使用正确的算法对其进行解密。根据给定的参数,它希望使用AES或Rijndael算法(示例代码),其中必须输入base64解码字节、密钥和IV

之后,你希望得到你想要的数据

所以我自己写了一个例子,我能够用C#对指定的消息进行加密和解密

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

您的iOS消息:
qd+SGaij5KSBScuLs3TpJS/3Dew8fHTudcs/5mg7q1kqcrzzyycmggtcqueeed5f
我的C#消息:
wC2dn+QVhOhf+nqzvskoldh2xdadg3smczrkf+tjqsgfxu07behridqkbgy80o

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

例如:

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

给定的base64字符串
qd+SGAIJ5KSBCSCLUS3TPJS/3Dew8fHTudcs/5MG7Q1KQCRZZYCMGTCQUEEED5F
是一个双向包

首先必须对其进行base64解码(即),然后必须使用正确的算法对其进行解密。根据给定的参数,它希望使用AES或Rijndael算法(示例代码),其中必须输入base64解码字节、密钥和IV

之后,你希望得到你想要的数据

所以我自己写了一个例子,我能够用C#对指定的消息进行加密和解密

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

您的iOS消息:
qd+SGaij5KSBScuLs3TpJS/3Dew8fHTudcs/5mg7q1kqcrzzyycmggtcqueeed5f
我的C#消息:
wC2dn+QVhOhf+nqzvskoldh2xdadg3smczrkf+tjqsgfxu07behridqkbgy80o

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

例如:

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

每个平台上的加密文本现在为:

X/aopyVDDva/wJ3If/5i73JGjwth9eH45Opxaaswgb8Kx3ynh8BhBTFRrHT0/i3y

这是正在工作的C代码

注:C#代码摘自

这是正在运行的iOS代码

    #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 *dEncrypt = [self doCipher:dData key:sKey iv:sIv context:kCCEncrypt];
        NSData *base64 = [dEncrypt base64EncodedDataWithOptions:0];
        NSString *sBase64 = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];
        NSLog(@"Base64 String: %@",sBase64);

        NSData *dDecrypt= [self decrypt:dEncrypt key:sKey iv:sIv];
        NSString *sDecrypt = [[NSString alloc] initWithData:dDecrypt encoding:NSUTF8StringEncoding];
        NSLog(@"Decrypted Data: %@",sDecrypt);
    }

    - (NSData *)doCipher:(NSData *)plainText
                     key:(NSString *)key
                      iv:(NSString *)iv
                 context:(CCOperation)encryptOrDecrypt
    {
        NSUInteger dataLength = [plainText length];

        size_t buffSize = dataLength + kCCBlockSizeAES128;
        void *buff = malloc(buffSize);

        size_t numBytesEncrypted = 0;

        NSData *dIv = [iv dataUsingEncoding:NSUTF8StringEncoding];
        NSData *dKey = [key dataUsingEncoding:NSUTF8StringEncoding];

        CCCryptorStatus status = CCCrypt(encryptOrDecrypt,
                                         kCCAlgorithmAES128,
                                         kCCOptionPKCS7Padding,
                                         dKey.bytes, kCCKeySizeAES256,
                                         dIv.bytes,
                                         [plainText bytes], [plainText length],
                                         buff, buffSize,
                                         &numBytesEncrypted);
        if (status == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buff length:numBytesEncrypted];
        }

        free(buff);
        return nil;
    }
#导入
-(无效)viewDidLoad{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
NSString*sData=@“晚上8点在秘密地点见我”;
NSString*sIv=@“4QesEr03HwE5H1C+ICw7SA==”;
NSString*sKey=@“ovA6siPkyM5Lb9oNcnxLz676K6JK6FrJKk4efEUWBzg=”;
NSData*dData=[sData数据使用编码:NSUTF8StringEncoding];
NSData*dEncrypt=[self-doCipher:dData-ke