65,210
社区成员
发帖
与我相关
我的任务
分享
//获取随机密钥
void getKey(char *src,int src_len,char *m_box)
{
int i;
for( i = 0 ; i < 256 ; i++ )
m_box[i] = i; //////1.m_box是char数组,初始化时将出现128以上的元素为负数,为后面的计算带来隐患,应将类型改成unsigned char
int j = 0;
for( i = 0 ; i < 256 ; i++ )
{
i %= src_len; //////2.在src_len<=256情况下,i永远小于256,死循环了
j = (j + src[i] + m_box[i]) % 256; /////由于1的原因,求出的j可能为负数,将造成数组访问越界
swap(&m_box[i],&m_box[j]);
}
}
//加密过程
char *encryptRC4(char *src,int src_len)
{
char index; ///////应使用int index
if(src == NULL)
return NULL;
char m_box[256];
getKey(src,src_len,m_box);
int i;
int x = 0;
int y = 0;
for( i = 0 ; i < src_len ; i++)
{
x = (x + 1) % 256;
y = (m_box[x] + y) % 256;
swap(&m_box[y],&m_box[y]);
index = (m_box[x] + m_box[y]) % 256; /////可能越界
src[i] ^= m_box[index];
}
// src[src_len] = '\0';
return src;
}
int main()
{
char src[] = "123456";
char *result = NULL;
result = encryptRC4(src,6);
cout << result ; //////加密后,应该不是普通的字符串了,打印出16进制数值更好~
return 0;
}
#include <stdio.h>
#include <string.h>
//此程序为RC4流密码算法的实现
int is_Sourcepathright(char *source_path);
int is_Destpathright(char *dest_path);
int Check(int argc,char **argv);
int Crypt(char *sourcepath,char *destpath,char *key);
int Decrypt(char *sourcepath,char *destpath,char *key);
int main(int argc,char **argv)
{
if (Check(argc,argv)==0){
return -1;
}
if (argv[4][0]=='e'||argv[4][0]=='E'){
if(Crypt(argv[1],argv[2],argv[3]))
return 1;
else
return -1;
}
if (argv[4][0]=='d'||argv[4][0]=='D'){
if(Crypt(argv[1],argv[2],argv[3]))
return 1;
else
return -1;
}
return -1;
}
int is_Sourcepathright(char *source_path)
{
FILE *fp;
if ((fp=fopen(source_path,"rb"))==NULL){
printf("您所输入的文件不存在.");
fclose(fp);
return 0;
}
else{
fclose(fp);
return 1;
}
}
int is_Destpathright(char *dest_path)
{
FILE *fp;
if ((fp=fopen(dest_path,"wb"))==NULL){
printf("输入的路径不正确.");
fclose(fp);
return 0;
}
else{
fclose(fp);
return 1;
}
}
int is_InputKeyRight(char *inputkey)
{
if(strlen(inputkey)<=256&&strlen(inputkey)>0)
return 1;
else
return 0;
}
int Check(int argc,char **argv)
{
if(argc!=5){
printf("命令长度有错误。\n");
return 0;
}
if(is_Sourcepathright(argv[1])==0){
return 0;
}
if(is_Destpathright(argv[2])==0){
return 0;
}
if(is_InputKeyRight(argv[3])==0){
printf("输入的密钥不正确。\n");
return 0;
}
if(strlen(argv[4])>1){
printf("错误的加解密类型。\n");
return 0;
}
if(argv[4][0]!='e'&&argv[4][0]!='E'&&argv[4][0]!='d'&&argv[4][0]!='D'){
printf("错误的加解密类型。\n");
return 0;
}
return 1;
}
void InitS(unsigned char *s)
{
int i;
for(i=0;i<256;i++)
s[i]=i;
}
void InitT(unsigned char *t,char *inputkey)
{
int i;
for(i=0;i<256;i++)
{
t[i]=inputkey[i%strlen(inputkey)];
}
}
void Swap(unsigned char *s,int first,int last)
{
unsigned char temp;
temp=s[first];
s[first]=s[last];
s[last]=temp;
}
void InitPofS(unsigned char *s,unsigned char *t)
{
int i;
int j=0;
for(i=0;i<256;i++)
{
j=(j+s[i]+t[i])%256;
Swap(s,i,j);
}
}
int Crypt(char *sourcepath,char *destpath,char *key)
{
unsigned char s[256]={0};
unsigned char t[256]={0};
int buf;
FILE *fsource;
FILE *fdest;
int i=0;
int j=0;
int k=0;
int temp;
InitS(s);
InitT(t,key);
InitPofS(s,t);
fsource=fopen(sourcepath,"rb");
fdest=fopen(destpath,"wb");
buf=fgetc(fsource);
while(buf!=EOF){
i=(i+1)%256;
j=(j+s[i])%256;
Swap(s,i,j);
temp=(s[i]+s[j])%256;
k=s[temp];
fputc(k^buf,fdest);
buf=fgetc(fsource);
}
return 1;
}