[Facee]iOS---关于微信平台Java 后端AES加密的app前端实现
-
按照Java流程是全部转化为字节流 然后PKCS#7 补码 然后进行256/CBC/NoPadding以(EncodingAesKey+“=”)解出来的32位的东东(AesKey)进行加密
-
其中AesKey这个东西decode之后转String是nil所以我们最好像Java一样全改成字节流
-
其中钥匙和向量都是用的同一个
-
很多相关的知识我觉得还是了解一点点了再来看文章比较清晰可能会有点成长
全是文字是不是很恶心,好的,我知道了。。。
- 以下是流处理相关方法
/*
* random(16)
*/
-(NSString *)Echat_return16LetterAndNumber{
//池//
NSString * strAll = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//初始化//
NSString * result = [[NSMutableString alloc]initWithCapacity:16];
for (int i = 0; i < 16; i++)
{
//获取随机数
NSInteger index = arc4random() % (strAll.length-1);
char tempStr = [strAll characterAtIndex:index];
result = (NSMutableString *)[result stringByAppendingString:[NSString stringWithFormat:@"%c",tempStr]];
}
return result;
}
//--网络字节序 传入 content字节长度
- (NSData *)Echat_netBytesTransferFor32Bit:(UInt32)origin {
Byte blockIndexArray[4];
blockIndexArray[0] = (Byte)(origin >> 24) & 0xFF;
blockIndexArray[1] = (Byte)(origin >> 16) & 0xFF;
blockIndexArray[2] = (Byte)(origin >> 8) & 0xFF;
blockIndexArray[3] = (Byte)(origin & 0xFF);
return [NSData dataWithBytes:blockIndexArray length:sizeof(blockIndexArray)];
}
//补的char
static NSData * chr(int a){
Byte target[1];
target[0] = (Byte)(a & 0xFF);
return [NSData dataWithBytes:target length:sizeof(target)];
}
//PKCS#7补码(参照java后端)
static int BLOCK_SIZE = 32;
-(NSData * )PKCS7Encode:(int)count{
int amount2Pad = BLOCK_SIZE - (count % BLOCK_SIZE);
if (amount2Pad == 0) {
amount2Pad = BLOCK_SIZE;
}
NSMutableData * dataM = [NSMutableData data];
NSData * data = chr(amount2Pad);
for (int i = 0;i<amount2Pad; i++) {
[dataM appendData:data];
}
return dataM.copy;
}
- 以下是拼接逻辑
//创建一个容器//
NSMutableData * dataTube = [NSMutableData data];
//random(16)//
NSData * randomData = [[self Echat_return16LetterAndNumber] dataUsingEncoding:NSUTF8StringEncoding];
//conteData//
NSData * contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
//netWorkBtyesData//
NSData * netByteData = [self Echat_netBytesTransferFor32Bit:(unsigned int)[contentData length]];
//appIdData//
NSData * appIdData = [self.appId.text dataUsingEncoding:NSUTF8StringEncoding];
//组合---次序很重要//
[dataTube appendData:randomData];
[dataTube appendData:netByteData];
[dataTube appendData:contentData];
[dataTube appendData:appIdData];
//进行PKCS#7补码
NSData * supplyData = [self PKCS7Encode:(int)dataTube.length];
[dataTube appendData:supplyData];
//aesKey
NSString * encodeString = [NSString stringWithFormat:@"%@=",self.encodingAesKey.text];
NSData * aesKey2 = [[NSData alloc]initWithBase64EncodedString:encodeString options:NSDataBase64DecodingIgnoreUnknownCharacters];
//加密
[AESCrypt encrypt:dataTube.copy password:aesKey2];
- 附上GitHub--AESCrypt框架里面修改的地方(全改成了流输入) -- 由于java那边是CBC/NoPadding的在原有的options:改成Ox0000
//加密方法
+ (NSString *)encrypt:(NSData *)message password:(NSData *)password {
NSData *encryptedData = [message AES256EncryptedDataUsingKey:password error:nil];
////打印字节与安卓对应
// char * byte = (char *)[encryptedData bytes];
// for (int i = 0;i < encryptedData.length; i++) {
// NSLog(@"AES 256 -- %d ---%d",i,byte[i]);
// }
NSString *base64EncodedString = [NSString base64StringFromData:encryptedData length:[encryptedData length]];
return base64EncodedString;
}
- 嗯。。。这是完全照着java的写法 其实这是最麻烦的一种写法
- 简单的写法就是加密方法照样传流 但是options 不改 kCCOptionPKCS7Padding 就不需要前面的补码操作了 因为苹果有这个补码的option~
- 弄了一天多也是hin烦了
网友评论