RC4Tool文件加密与解密

原创 2016年08月29日 01:11:07

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);



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

RC4加密算法

 RC4加密算法 RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为...

cocos rc4加解密

static Data getData(const std::string& filename, bool forString) { if (filename.empty()) { ...

cocos lua 加密与解密 混淆 (版本cocos3.4)

cocos luacompile cocos luacompile OverviewUsageAvailable ArgumentsSamples Overview Compile the .l...
  • Kaitiren
  • Kaitiren
  • 2015年03月19日 14:17
  • 13049

用 Java 实现的 Rc4 加密算法

转载自:http://blog.csdn.net/a9529lty/article/details/4813393 有一个项目,需要解析一个用户提供的rc4加密后的文件,特意搜索整理了一个j...

java RC4加密解密

java RC4加密解密

用 Java 实现的 Rc4 加密算法

转载自:http://blog.csdn.net/a9529lty/article/details/4813393 有一个项目,需要解析一个用户提供的rc4加密后的文件,特意搜索整理了一...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

RC4加解密算法

#include #include typedef unsigned long ULONG; void rc4_init(unsigned char *s, unsigned char *k...

给Lua添加新的C模块(.so文件)

今天,我给我的测试软件框架添加了一个C模块,里面封装了一个sleep的系统调用。我的目的是在用Lua时,要延时的话,不用执行os.execute("sleep 5") 之类的蹩脚语句,而替之以mt.s...

hex-rays公司最强的反编译工具 IDA Pro 6.4 Plus 最新版的来了

hex-rays公司最强的反编译工具 IDA Pro 6.4 Plus 最新版本 hex-rays公司最强的反编译工具 IDA Pro 6.4 Plus 最新版的来了 反汇...
  • qdsw123
  • qdsw123
  • 2013年06月05日 22:56
  • 8441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RC4Tool文件加密与解密
举报原因:
原因补充:

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