思路
我開始想的是不管是視頻還是其他文件加密應該是對數(shù)據(jù)流
的加密,我想到使用NSStream
在實際的操作的時候發(fā)現(xiàn)效率太低了 一個 100MB+文件 解密加密耗時太久了,于是打算用C來操作
加密->判斷是否加密->文件頭加密->內(nèi)容加密
解密->判斷文件頭->對內(nèi)容解密
代碼:假定文件前9位做頭加密
第一步打開文件 fopen()
FILE *fin = fopen([fpold cStringUsingEncoding:NSUTF8StringEncoding], "r");
FILE *fout = fopen([fpnew cStringUsingEncoding:NSUTF8StringEncoding], "wb+");
//保證文件有效
if (fin == NULL || fout == NULL) {
printf("fin == NULL || fout == NULL \n");
return @"";
}
其中文件使用方式是很講究其中有幾個特別要注意:
r 打開只讀文件,該文件必須存在。
w 打開只寫文件,若文件存在則文件長度清為0蛹头,即該文件內(nèi)容會消失案站。若文件不存在則建立該文件。
b 讀寫打開一個二進制文件共啃,允許讀或在文件末追加數(shù)據(jù)不铆。
第二步讀取文件-判斷是否加密
這是我開始寫的
FILE *readFile;
readFile = fopen([path cStringUsingEncoding:NSUTF8StringEncoding], "rb+");
if (readFile != NULL) {
fseek(readFile, 0, SEEK_SET);
char list[9] = { 0 };
fread(list, sizeof(char), 9, readFile);
fclose(readFile);
readFile = NULL;
char wlist[9] = HEAD_KEY;
return strcmp(list, wlist);
}else{
printf("readFile == NULL\n");
}
看上去好像沒什么問題但是好像發(fā)現(xiàn)有問題就是 strcmp
這個方法具體導致他們不同的原因是 list 和 wlist 賦值導致的,可以發(fā)現(xiàn)一個問題就是 wlist 里char[]是和 list 里char[]一樣的
不難發(fā)現(xiàn)mmp 你們char都一樣但是他們的char[]不一樣 好絕望呀,不要緊我們把char取出來再比對(具體原因還請大佬告知一下)
NSMutableString *hexString = [NSMutableString string];
for (int i=0; i<sizeof(list); i++){
[hexString appendFormat:@"%02x ", list[i]];
}
NSMutableString *keyString = [NSMutableString string];
for (int i=0; i<sizeof(wlist); i++){
[keyString appendFormat:@"%02x ", wlist[i]];
}
return [keyString isEqualToString:hexString]?NO:YES;
第三步文件頭加密
我干啥你只有兩行代碼你自己都不信
char wlist[10] = HEAD_KEY;
fputs(wlist,fout);
讓我看看他們做什么了:
//獲取到加密key
char wlist[10] = HEAD_KEY;
//寫入文件(原因:w 打開只寫文件,若文件存在則文件長度清為0啥纸,即該文件內(nèi)容會消失号杏。若文件不存在則建立該文件)
fputs(wlist,fout);
我們還差兩步就完成了是不是很簡單呀
第四步文件加密
char buf[READ_BUFF];
unsigned long nread ;
while( (nread = fread(buf, sizeof(char), READ_BUFF, fin)) ){
ccode(buf, nread);
fwrite(buf,sizeof(char),nread,fout);
}
是的就沒了我們瞅瞅發(fā)生了什么
//每次讀取流(buff)的大小
char buf[READ_BUFF];
//讀取到的buff大小 作為循環(huán)開關
unsigned long nread ;
//循環(huán)去讀取文件每次讀取一個buff去處理
while( (nread = fread(buf, sizeof(char), READ_BUFF, fin)) ){
//對buff進行加密具體可以查看Demo
ccode(buf, nread);
//把加密后的buff寫入文件
fwrite(buf,sizeof(char),nread,fout);
}
第五步文件解密
fseek(fin, 9, SEEK_SET);
char buf[READ_BUFF];
unsigned long nread ;
while( (nread = fread(buf, sizeof(char), READ_BUFF, fin)) ){
cdecode(buf, nread);
fwrite(buf,sizeof(char),nread,fout);
}
[圖片上傳失敗...(image-30fde5-1526525205888)]
是的核心的代碼基本寫完了其實加密和解密是一個思路只是要跳過文件加密頭部分
fseek(fin, 9, SEEK_SET);
接著對文件進行解密就行了.