使用使用AES的iOs CCCrypt函数生成的C#解密base64字符串
有人能帮我把下面的iOS代码生成的base64字符串解密成C#等价物吗 我试图在c#内以“晚上8点在秘密地点见我”结束 iOS生成了以下加密:qd+SGAIJ5KSBCSCLUS3TPJS/3Dew8fHTudcs/5MG7Q1KQCRZZYCMGTCQUEED5F 此iOS代码根据需要在XCode 6中成功加密和解密数据 提前感谢您的帮助和支持 达伦使用使用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 {
#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