最近在弄AES解密,解密方法是 iv取加密文件内容的前16位,然后解密之后把内容里面的填充字符b"\0"去掉
1.首先是把data转成Byte数组 然后取前16位
Byte *testByte = (Byte *)[data bytes];
Byte *bytes =malloc(sizeof(*bytes)*data.length);
for(int i=0;i<16;i++){
bytes[i] = testByte[i];
}
2.跟后端同步好补位方法 我这里是不补位填0 其他补位方法自行查找
3.去掉数据里面补位的0,我这里是把data转换成字符串 ,我这边是不足16位,会补够0到16位

+(NSString *)AES128Decrypt:(NSData *)data key:(NSString *)key{
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
//16字节的偏移量
Byte *testByte = (Byte *)[data bytes];
Byte *bytes =malloc(sizeof(*bytes)*data.length);
for(int i=0;i<16;i++){
bytes[i] = testByte[i];
}
size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
0,//不补位
keyPtr,
kCCBlockSizeAES128,
bytes,
[data bytes],
dataLength,
buffer,
bufferSize, &numBytesCrypted);
if (cryptStatus == kCCSuccess) {
//原始数据
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
//原始数据去掉前面16位的偏移量
NSData *subData = [resultData subdataWithRange:NSMakeRange(16, resultData.length-16)];
//方法:https://www.jianshu.com/p/fb9d3a69d3d3
NSString *plaintext = @"";
char termChar[1] = {'\0'};
NSMutableData *data = [NSMutableData dataWithBytes:subData.bytes length:subData.length];
[data appendBytes:termChar length:1];
plaintext = [[NSString alloc] initWithCString:data.bytes encoding:NSUTF8StringEncoding];
return plaintext;
}
free(buffer);
return nil;
}
AES解密使用方法
NSData *testData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"1.txt" ofType:@""]];
NSString *laststr = [QLAESDecrypt AES128Decrypt:testData key:@"keykeykey"];
NSLog(@"laststr::%@",laststr);
下面是Des解密 单纯MARK下
//Des解密
+(NSData *)decryptUseDES:(NSString *)plainText key:(NSString *)key{
NSData *plaindata = nil;
NSData *cipherdata = [[NSData alloc] initWithBase64EncodedString:plainText options:NSDataBase64DecodingIgnoreUnknownCharacters];
size_t bufferSize = cipherdata.length;
void * buffer = malloc(bufferSize);
NSData * date = [key dataUsingEncoding:NSUTF8StringEncoding];
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,/* 算法 */
kCCOptionPKCS7Padding,
[key UTF8String],
kCCKeySizeDES,
[date bytes],
[cipherdata bytes],
[cipherdata length],
buffer,
bufferSize,
&numBytesDecrypted);
if(cryptStatus == kCCSuccess)
{
plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
return plaindata;
}
return plaindata;
}
网友评论