iOS AES 128 CBC No Padding暗号解読
4712 ワード
最近のプロジェクトではデータ転送は暗号化に使われており、プロジェクトはAES 128 CBC No Padding暗号化方式を選択しており、PHPやAndroid側のコードネットワークが多すぎる.しかしiOSだけはありませんが、別の書き方もありますが、AES 128 CBC No PaddingかCBC No Paddingではありません.自分で真似して書いたけど、PHP端はなかなか解読できない.問題は...No Padingの場合は、必ず暗号化データがkCCKeySizeAE S 128倍数部分ではなく0 x 0000のパディングを行います.そうでないと、暗号化長が正しくありません.一般的にはkCCOptionPKCS 7 Padding(つまり0 x 001)を使用してパディングを行いますが、私たちはNo Paddingなので0 x 000でパディングします.暗号化した後に更に暗号化データに対してBase 64暗号化を行って、googleのGTMBase 64を使って、ないネット上で自分で探して、下のiosのコード:DES 3 Util.h内容
//
// DES3Util.h
// JuziAnalyticsDemo
//
// Created by wanyakun on 13-6-6.
// Copyright (c) 2013 The9. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface DES3Util : NSObject
+ (NSString*) AES128Encrypt:(NSString *)plainText;
+ (NSString*) AES128Decrypt:(NSString *)encryptText;
@end
DES3Util.mファイル内容
//
// DES3Util.m
// JuziAnalyticsDemo
//
// Created by wanyakun on 13-6-6.
// Copyright (c) 2013 The9. All rights reserved.
//
#import "DES3Util.h"
#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"
#define gkey @"16 " //
#define gIv @"16 " //
@implementation DES3Util
+(NSString *)AES128Encrypt:(NSString *)plainText
{
char keyPtr[kCCKeySizeAES128+1];
memset(keyPtr, 0, sizeof(keyPtr));
[gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128+1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
int newSize = 0;
if(diff > 0)
{
newSize = dataLength + diff;
}
char dataPtr[newSize];
memcpy(dataPtr, [data bytes], [data length]);
for(int i = 0; i < diff; i++)
{
dataPtr[i + dataLength] = 0x00;
}
size_t bufferSize = newSize + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
memset(buffer, 0, bufferSize);
size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
0x0000, //No padding
keyPtr,
kCCKeySizeAES128,
ivPtr,
dataPtr,
sizeof(dataPtr),
buffer,
bufferSize,
&numBytesCrypted);
if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
return [GTMBase64 stringByEncodingData:resultData];
}
free(buffer);
return nil;
}
+(NSString *)AES128Decrypt:(NSString *)encryptText
{
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
0x0000,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[data bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];
}
free(buffer);
return nil;
}
@end