关闭

RC4Tool文件加密与解密

597人阅读 评论(0) 收藏 举报
分类:

RC4Tool.h

//
//  RC4Tool.h
//  Rc4Test
//
//  Created by jianan on 16/8/29.
//
//

#ifndef RC4Tool_h
#define RC4Tool_h
#include <string>
#include <vector>
using namespace std;

class RC4Tool
{
public:
    static RC4Tool* getInstance();
    void encryptOrDecryptFilesInDir(string strDirName);
    void encryptOrDecryptFile( unsigned char* data, unsigned long len ); //data为加密或者解密的文件数据流   len为加密或解密的长度
    void setPrivateKey( unsigned char* key, unsigned long key_len ); //key传入一个unsigned char key[256]   key_len为strlen key_len得到的长度
private:
    void getAllFilesInDir(string strFileDir, vector<string>& vecFileName);
    void rc4_init(unsigned char*s,unsigned char*key,unsigned long Len);
    void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len);
};


#endif /* RC4Tool_h */
RC4Tool.cpp

//
//  RC4Tool.cpp
//  Rc4Test
//
//  Created by jianan on 16/8/29.
//
//

#include "RC4Tool.h"
#include <dirent.h> 
USING_NS_CC;

static RC4Tool* instance = NULL;

unsigned char __g_rc4_sBox[ 256 ] = { 0 };

RC4Tool* RC4Tool::getInstance()
{
    if(instance == NULL)
    {
        instance = new RC4Tool();
        return instance;
    }
    return instance;
}


void RC4Tool::encryptOrDecryptFile( unsigned char* data, unsigned long len )
{
    char sbox[256];
    memcpy( sbox, __g_rc4_sBox, 256 );
    
    rc4_crypt( (unsigned char*)sbox , data, len );
}



/**
1.在applicationDidFinishLaunching()第一行调用
2.char privateKey[256] = {"helloworld"};
3.RC4Tool::getInstance()->setPrivateKey((unsigned char*)privateKey, strlen(privateKey));
**/
void RC4Tool::setPrivateKey( unsigned char* key, unsigned long key_len )
{
    rc4_init( __g_rc4_sBox, key, key_len );
}

void RC4Tool::encryptOrDecryptFilesInDir(string strDirName)
{
    vector<string> vecFileName;
    getAllFilesInDir(strDirName  , vecFileName);
    for(vector<string>::iterator iter = vecFileName.begin(); iter != vecFileName.end(); iter++)
    {
        printf("\nfile:%s\n", (*iter).c_str());
        Data data = FileUtils::getInstance()->getDataFromFile(*iter);
        unsigned char* str =  data.getBytes();
        if(data.isNull())
        {
            continue;
        }
        encryptOrDecryptFile(str, data.getSize());
        
        FILE* fp = fopen(FileUtils::getInstance()->fullPathForFilename(*iter).c_str(), "wb");
        if(fp){
            fwrite(str, data.getSize(), 1, fp);
        }
        fclose(fp);
    }
}

void RC4Tool::getAllFilesInDir(string strFileDir, vector<string>& vecFileName)
{
    vector<string> vecPath;
    
    DIR* dp;
    struct dirent* dirp;
    if ( (dp = opendir(strFileDir.c_str())) == NULL )
    {
        printf("cannot open %s\n", strFileDir.c_str());
    }
    if (dp == NULL || dirp == NULL)
    {
        return;
    }
    
    while ( (dirp = readdir(dp)) != NULL )
    {
        string p = dirp->d_name;
        if (p == "." || p == "..")
        {
            continue;
        }
        
        string strNewFilePath = strFileDir+"/"+p;
        if (dirp->d_type == 4) //目录
        {
            
            getAllFilesInDir(strNewFilePath, vecFileName);
        }
        else if(dirp->d_type == 8) //文件
        {
            vecFileName.push_back(strNewFilePath);
        }
    }
    
    closedir(dp);
}


void RC4Tool::rc4_init(unsigned char*s,unsigned char*key,unsigned long Len)
{
    int i=0,j=0;
    char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++)
    {
        s[i]=i;
        k[i]=key[i%Len];
    }
    for(i=0;i<256;i++)
    {
        j=(j+s[i]+k[i])%256;
        tmp=s[i];
        s[i]=s[j];//交换s[i]和s[j]
        s[j]=tmp;
    }
}

void RC4Tool::rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)
    {
        i=(i+1)%256;
        j=(j+s[i])%256;
        tmp=s[i];
        s[i]=s[j];//交换s[x]和s[y]
        s[j]=tmp;
        t=(s[i]+s[j])%256;
        Data[k]^=s[t];
    }
}

初始化

   FileUtils::getInstance()->addSearchPath("data");
    char privateKey[256] = {"helloworld"};
    RC4Tool::getInstance()->setPrivateKey((unsigned char*)privateKey, strlen(privateKey));

解密

    Data data = FileUtils::getInstance()->getDataFromFile("data1.txt");
    unsigned char* str =  data.getBytes();
    RC4Tool::getInstance()->encryptOrDecryptFile(str, data.getSize());
    printf("\n解密后数据:\n%s", str);



0
0
查看评论

使用openssl中的加密函数AES、RC4、RSA对文件加密的一个例子

对加密有所了解的读者,相信对这三种加密算法也已经有了些许了解。 比如RSA是一种很慢的加密方式,他是非对称的,需要有公钥和私钥。对文件中的数据,不大适合用这种方式来加密。因为我使用的是对整个图片文件的每16个字节进行加密,要是每次都对取出来的16字节进行RSA加密,那速度,是相当慢的。 所以...
  • zengraoli
  • zengraoli
  • 2013-11-30 21:53
  • 9918

简单利用RC4算法对文件进行加密

  • 2014-10-15 11:34
  • 4.51MB
  • 下载

RC4加密算法在C++中的实现(转)

在一些场合,常需要用到一些简单的加密算法,这里的RC4就可以说是最简单的一种。只要设置一个足够强的密码,就可以适用于一些非常简单的场合了。我是用来加密HTTP传送的数据的。RC4函数(加密/解密)    其实,RC4只有加密,将密文再加密一次,就是解密了。GetKey函...
  • redpetallsg
  • redpetallsg
  • 2008-03-10 15:16
  • 5471

RC4加密算法在C++中的实现

在一些场合,常需要用到一些简单的加密算法,这里的RC4就可以说是最简单的一种。只要设置一个足够强的密码,就可以适用于一些非常简单的场合了。我是用来加密HTTP传送的数据的。 RC4函数(加密/解密)    其实,RC4只有加密,将密文再加密一次,就是解密了。 Get...
  • xiaohei5188
  • xiaohei5188
  • 2013-04-22 07:23
  • 960

RC4加密算法的原理及实现

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。        ...
  • lc_910927
  • lc_910927
  • 2014-07-09 15:57
  • 21162

RC4加密算法在C++中的实现

在一些场合,常需要用到一些简单的加密算法,这里的RC4就可以说是最简单的一种。只要设置一个足够强的密码,就可以适用于一些非常简单的场合了。我是用来加密HTTP传送的数据的。RC4函数(加密/解密)    其实,RC4只有加密,将密文再加密一次,就是解密了。GetKey函...
  • chenxiaohua
  • chenxiaohua
  • 2008-02-14 16:12
  • 9308

URL加密解密

jsp中:     测试北京电大首页输入参数中包含中文用户名的问题        String uri = request.getRequestURI();    StringBuffer url = ...
  • lijun_xiao2009
  • lijun_xiao2009
  • 2013-06-27 10:15
  • 798

C语言使用openssl库进行加密

使用MD5加密   我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入...
  • u010144805
  • u010144805
  • 2017-11-24 19:22
  • 69

C语言之文件的加密与解密

#include #include int getfilesize(char *path) { FILE *pf = fopen(path, "r"); if (pf == NULL) { return -1; } else { fseek(pf, 0, S...
  • zym326975
  • zym326975
  • 2017-06-02 08:25
  • 961

【加密解密】 文件的加密解密 <含源代码>

这段代码主要实现了讲一个TXT文件按照一定算法加密,然后解密的过程。
  • jobbofhe
  • jobbofhe
  • 2016-04-29 16:17
  • 593
    个人资料
    • 访问:799644次
    • 积分:19047
    • 等级:
    • 排名:第553名
    • 原创:1108篇
    • 转载:24篇
    • 译文:0篇
    • 评论:59条
    博客专栏
    最新评论
    python入门专栏
    介绍python的最基础的知识