简单的加解密工具

原创 2012年03月26日 05:01:57
目的:
        一、部分私人文件不想让别人看到, Linux下又不能用Windows上的加解密工具 (也许有现成的东西, 只是我自己不知道吧, 不过也懒得搜了)
        二、最近再看APUE, 写点代码当实践与复习 (发现又开始忘了)

算法:
        文件字节与密钥顺序进行异或

功能:
        一、对指定文件加密或解密
        二、对指定文件夹中所有文件加密或解密

缺陷:
        一、单个文件必须小于2G
        二、由于是直接在文件上做修改, 故而可能因为某些特殊原因(停电等造成的程序非正常终止)致使文件被破坏

注意:

        如果忘了密钥, 猜测时一定要注意, 比如用XXX解密, 发现没解密出原始数据, 记得要再用一次XXX解密成猜测前的状态

#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>

#define PWD_MAX_LEN  (64)

int 
encry_file(const char * filename, const char * password, int pwdlen)
{
    int         i;
    int         n;
    int         filedes;
    long        position;
    char        buffer[BUFSIZ];
    char        cwd[PATH_MAX + 1];

    if (getcwd(cwd, PATH_MAX + 1) == NULL) {
        printf("getcwd error\n");
        exit(127);
    }

    if ((filedes = open(filename, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO)) == -1) {
        printf("open failed for \"%s/%s\"\n", cwd, filename);
        exit(127);
    }

    position = 0;
    while ((n = read(filedes, buffer, BUFSIZ)) > 0) {
        for (i = 0; i < n; ++i) {
            buffer[i] ^= password[n % pwdlen];
        }
        lseek(filedes, position, SEEK_SET);
        if (write(filedes, buffer, n) != n) {
            printf("write error for \"%s/%s\"\n", cwd, filename);
            exit(127);
        }
        position += n;
    }

    if (n < 0) {
        printf("read error for \"%s/%s\"\n", cwd, filename);
        exit(127);
    }

    close(filedes);

    return 0;
}

int 
encry_dir(const char * dirname, const char * password, int pwdlen)
{
    DIR           * dp;
    struct dirent * dirp;
    struct stat     statbuf;
    char            cwd[PATH_MAX + 1];

    if ((dp = opendir(dirname)) == NULL) {
        printf("opendir failed for \"%s/%s\"\n", cwd, dirname);
        exit(127);
    }

    while ((dirp = readdir(dp)) != NULL) {
        if (strcmp(dirp->d_name, ".") == 0 ||
            strcmp(dirp->d_name, "..") == 0) {
            continue;
        }

        if (getcwd(cwd, PATH_MAX + 1) == NULL) {
            printf("getcwd error\n");
            exit(127);
        }

        if (chdir(dirname) == -1) {
            printf("chdir error for \"%s\"\n", dirname);
            exit(127);
        }

        if (lstat(dirp->d_name, &statbuf) == -1) {
            printf("lstat failed for \"%s/%s\"\n", cwd, dirp->d_name);
            exit(127);
        }

        if (S_ISREG(statbuf.st_mode)) {
            encry_file(dirp->d_name, password, pwdlen);
        }
        else if (S_ISDIR(statbuf.st_mode)) {
            encry_dir(dirp->d_name, password, pwdlen);
        }

        if (chdir(cwd) == -1) {
            printf("chdir error for \"%s\"\n", cwd);
            exit(127);
        }
    }

    closedir(dp);

    return 0;
}

int 
main(void)
{
    int         i;
    int         pwdlen;
    char      * p;
    char        filename[PATH_MAX];
    char        pathname[PATH_MAX + 1];
    char        password[PWD_MAX_LEN];
    char        pwdcheck[PWD_MAX_LEN];
    char        cwd[PATH_MAX + 1];
    struct stat statbuf;

    printf("input file/directory name:\n");
    if (fgets(pathname, PATH_MAX + 1, stdin) == NULL) {
        printf("fgets error\n");
        exit(127);
    }

    i = strlen(pathname);
    assert(i >= 1);
    if (pathname[i - 1] == '\n') {
        pathname[i - 1] = '\0';
    }

    if (lstat(pathname, &statbuf) == -1) {
        printf("lstat failed for \"%s\"\n", pathname);
        exit(127);
    }

    printf("input password:\n");
    scanf("%s", password);
    printf("input password again:\n");
    scanf("%s", pwdcheck);
    password[sizeof(password) - 1] = '\0';
    pwdcheck[sizeof(pwdcheck) - 1] = '\0';

    pwdlen = strlen(password);
    if (pwdlen == 0 || strcmp(password, pwdcheck) != 0) {
        printf("password error\n");
        exit(127);
    }

    if (getcwd(cwd, PATH_MAX + 1) == NULL) {
        printf("getcwd error\n");
        exit(127);
    }

    if (S_ISREG(statbuf.st_mode)) {
        if ((p = strrchr(pathname, '/')) != NULL) {
            strcpy(filename, ++p);
            *p = '\0';
        }
        else {
            strcpy(filename, pathname);
            strcpy(pathname, cwd);
        }

        if (chdir(pathname) == -1) {
            printf("chdir error for \"%s\"\n", pathname);
            exit(127);
        }

        encry_file(filename, password, pwdlen);

        if (chdir(cwd) == -1) {
            printf("chdir error for \"%s\"\n", cwd);
            exit(127);
        }
    }
    else if (S_ISDIR(statbuf.st_mode)) {
        if (chdir(pathname) == -1) {
            printf("chdir error for \"%s\"\n", pathname);
            exit(127);
        }

        encry_dir(".", password, pwdlen);

        if (chdir(cwd) == -1) {
            printf("chdir error for \"%s\"\n", cwd);
            exit(127);
        }
    }
    else {
        printf("no file need to encry\n");
    }

    exit(0);
}


一个简单的Android文件加解密应用

本应用基于简单的casear加解密方法,同时具有简单的文件管理功能: 1、使用任意文件作为密钥或使用密码作为密钥; 2、同时对多个文件进行加解密; 3、文件剪切、拷贝、粘贴功能。 主界...
  • kuailedexingban
  • kuailedexingban
  • 2018年01月14日 10:23
  • 83

Java加密解密工具类

package com.sjzx.common.util; import java.lang.reflect.Method; import java.security.Key; import jav...
  • aoaoxiaoxian
  • aoaoxiaoxian
  • 2017年05月03日 22:07
  • 226

分享一个MD5加密java工具类

一直都有分享这个工具类的想法,只是碍于没有时间整理,所以一直没有把代码贴出来。 这是一个个人认为非常好用的使用MD5+salt加密的工具类,一部分代码由网上搜索而得,一部分自己修改添...
  • shanzhizi
  • shanzhizi
  • 2013年08月14日 22:22
  • 1838

3DES加密解密的工具类

import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.Secret...
  • liusocg520
  • liusocg520
  • 2013年10月30日 15:34
  • 833

Android AES和RSA混合加密工具类实现

这几天研究了一下android方面的加密技术,有RSA,md5,base64,AES等以及这几种加密的混合加密,其他还好,在RSA和AES混合加密的时候出现点问题,就拿出来说一下。         遇...
  • qq_16252123
  • qq_16252123
  • 2017年11月22日 15:01
  • 51

java加密解密工具类

package com.xy6.moneykeeper.syn; import java.security.MessageDigest; import javax.crypto.KeyGe...
  • daxiang12092205
  • daxiang12092205
  • 2015年06月04日 22:20
  • 3077

3DES加解密工具类

3DES加解密
  • foget_over
  • foget_over
  • 2017年05月26日 09:57
  • 194

加密解密工具类

import java.math.BigInteger; import java.security.MessageDigest; import java.security.SecureRandom; ...
  • yulei2008_
  • yulei2008_
  • 2016年09月20日 11:35
  • 1026

Java工具类——DES加密和解密工具 II

import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; imp...
  • softwave
  • softwave
  • 2014年03月13日 20:53
  • 5808

C++简单加解密

最近做个小项目,其中的用户名、密码要求加密,要求原字母、数字不会重现就行。//Password.h文件 CString Base64Encode(LPCTSTR lpszSrc);//加密 CStri...
  • qq_35488967
  • qq_35488967
  • 2017年02月22日 17:09
  • 281
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的加解密工具
举报原因:
原因补充:

(最多只允许输入30个字)