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



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

相关文章推荐

C++ <文本文件的加密与解密>

未加密文本.txtalmost loverYour fingertips against my skin The palm trees swaying in the wind in my chase...

加密与解密 基础篇1

1

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

使用ollydbg破解第一个小程序

使用ollydbg破解第一个小程序 本文破解的小程序来自《加密与解密》第三版第二章的样例程序,本文的目的在于记录自己学习的过程。 使用的工具有:Ollydbg、TraceMe.exe 1...

MD5加密算法和解密算法

MD5加密算法: package other; import java.security.MessageDigest; import java.security.NoSuch...
  • wszsj
  • wszsj
  • 2015-07-31 21:44
  • 258

解密系列(基础篇_转-Windows体系结构)

分析环境reactos0.3.1 ,i386体系] 了解了windows的体系结构才知道reactos到底要干什么,以及如何干,因为reactos的目标是兼容windows。 下面...

解密系列(基础篇_必备知识)

教程:鱼C解密系列     教材:《加密与解密》     多字节数据存放顺序与CPU有关,微处理器的存储顺序有正序和逆序(即大端存储和小端存储)。     常见的Intel系列使用的编码方式为逆...

Android:客户端和服务器之间传输数据加密

Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码;另一类是其他比较重要的,但是可以逆向解密的数据。        第一类:密码...

文件加密解密

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import...

JAVA文件加密与解密

package com.test; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io....

c#加密解密文件

c#加密解密文件 CryptoStream DESCryptoServiceProvider RijndaelManaged TripleDESCryptoServiceProvider
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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