package util /* #include #include #include int encfile(char *in_filename, char *pwd, char *out_filename) { if (in_filename ==NULL || pwd == NULL || out_filename ==NULL) { printf("invalid argument!\n"); return -3; } if (strlen(pwd)<6) { printf("pwd lenth must >=6\n"); return -3; } FILE *fp1, *fp2; register char ch; int j =0; int j0=0; fp1 = fopen(in_filename, "r"); if(fp1==NULL) { printf("cannot open in-file\n"); return -1; } fp2=fopen(out_filename, "w"); if(fp2==NULL) { printf("cannot open or create out-file\n"); return -2; } while(pwd[++j0]); ch = fgetc(fp1); while(!feof(fp1)) { if(j0>6) { j0=0; } ch +=pwd[j0++]; fputc(ch, fp2); ch = fgetc(fp1); } fclose(fp1); fclose(fp2); return 0; } int decfile(char *in_filename, char *pwd, char *out_filename) { if(in_filename == NULL || pwd == NULL || out_filename == NULL) { printf("invalid argument!\n"); return -3; } if (strlen(pwd) <6) { printf("pwd lenth must >=6\n"); return -3; } FILE *fp1, *fp2; register char ch; int j =0; int j0=0; fp1 = fopen(in_filename, "r"); if(fp1==NULL) { printf("cannot open in-file\n"); return -1; } fp2=fopen(out_filename, "w"); if(fp2==NULL) { printf("cannot open or create out-file\n"); return -2; } while(pwd[++j0]); ch = fgetc(fp1); while(!feof(fp1)) { if(j0>6) { j0=0; } ch -=pwd[j0++]; fputc(ch, fp2); ch = fgetc(fp1); } fclose(fp1); fclose(fp2); return 0; } //将明文加密后写入到文件中 int writeContent2EncFile(char *in_data, char *pwd, char *in_filename) { if (in_data == NULL || pwd == NULL || in_filename == NULL) { printf("invalid argument!\n"); return -3; } if (strlen(pwd) <6) { printf("pwd lenth must >=6\n"); return -3; } FILE *fp = fopen(in_filename, "w"); if(fp == NULL) { printf("cannot open file %s \n", in_filename); return -1; } int j =0; while(pwd[++j]); int i=0; int len = strlen(in_data); register char ch; for(i=0;i6) { j=0; } ch +=pwd[j++]; fputc(ch, fp); } fclose(fp); return 0; } //获取加密文件的内容 int readEncryptFile(char *in_filename, char *pwd, void **outData, int *len) { if (in_filename ==NULL || pwd == NULL || outData == NULL || len == NULL) { printf("invalid argument!\n"); return -3; } if (strlen(pwd) <6) { printf("pwd lenth must >=6\n"); return -3; } FILE *fp = fopen(in_filename, "r"); if(fp == NULL) { printf("cannot open file %s \n", in_filename); return -1; } fseek(fp, 0, SEEK_END); int size = ftell(fp); char *content = (char*)malloc(sizeof(char)*size); if(content == NULL) { printf("malloc file size:%d err!!!\n", size); fclose(fp); return -2; } memset(content, 0, size); fseek(fp, 0, SEEK_SET); int j = 0; while(pwd[++j]); char ch; int n = 0; while(!feof(fp)) { ch = fgetc(fp); if(j>6) { j=0; } ch -=pwd[j++]; content[n++] = ch; } *outData = content; *len = size; fclose(fp); return 0; } */ import "C" import ( "strconv" "unsafe" "errors" ) const pwd = "123456" func CallEncFile(srcAbsFileName string, outAbsPath string) error { inPath := C.CString(srcAbsFileName) cpwd := C.CString(pwd) outPath := C.CString(outAbsPath) defer func() { C.free(unsafe.Pointer(inPath)) C.free(unsafe.Pointer(outPath)) C.free(unsafe.Pointer(cpwd)) }() cret := C.encfile(inPath, cpwd, outPath) if cret!=0 { if cret == -1 { return errors.New("cannot open original file") } else if cret == -2 { return errors.New("cannot open or create output file") } else { return errors.New("unknown enc file err") } } return nil } func CallDecFile(srcAbsFileName string, outAbsPath string) error { inPath := C.CString(srcAbsFileName) cpwd := C.CString(pwd) outPath := C.CString(outAbsPath) defer func() { C.free(unsafe.Pointer(inPath)) C.free(unsafe.Pointer(outPath)) C.free(unsafe.Pointer(cpwd)) }() cret := C.decfile(inPath, cpwd, outPath) if cret!=0 { if cret == -1 { return errors.New("cannot open original file") } else if cret == -2 { return errors.New("cannot open or create output file") } else { return errors.New("unknown enc file err") } } return nil } func CallEncContent2File(data string, fpath string) error { cpath := C.CString(fpath) cpwd := C.CString(pwd) cdata := C.CString(data) defer func() { C.free(unsafe.Pointer(cpath)) C.free(unsafe.Pointer(cpwd)) C.free(unsafe.Pointer(cdata)) }() cRet := C.writeContent2EncFile(cdata, cpwd, cpath) if cRet != 0 { return errors.New("C.writeContent2EncFile ret:"+strconv.Itoa(int(cRet))) } return nil } //解密获取文件内容 func CallDecFileContent(fpath string) ([]byte, error) { inPath := C.CString(fpath) cpwd := C.CString(pwd) cData := unsafe.Pointer(nil) cLen := C.int(0) defer func() { C.free(unsafe.Pointer(inPath)) C.free(unsafe.Pointer(cpwd)) C.free(unsafe.Pointer(cData)) }() cRet := C.readEncryptFile(inPath, cpwd, &cData, &cLen) if cRet != 0 { return nil, errors.New("cgo call ret:"+ strconv.Itoa(int(cRet))) } fileData := C.GoBytes(cData, cLen) return fileData, nil }