看别人思路写了个RC4的加密算法,但是不知道哪里错了

heidaizx 2009-02-24 05:44:40
编译正确,但是运行出现位置错误
#include <iostream>
#include <cstring>
using namespace std;
char t;
#define swap(x,y) t=*x;*x=*y;*y=t;


//获取随机密钥
void getKey(char *src,int src_len,char *m_box)
{
int i;

for( i = 0 ; i < 256 ; i++ )
m_box[i] = i;

int j = 0;
for( i = 0 ; i < 256 ; i++ )
{
i %= src_len;
j = (j + src[i] + m_box[i]) % 256;
swap(&m_box[i],&m_box[j]);

}
}

//加密过程
char *encryptRC4(char *src,int src_len)
{
char 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 ;
return 0;
}
另外我不太清楚这个RC4的原理,谁能说下
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
genius_tong 2009-02-25
  • 打赏
  • 举报
回复
友情UP~~~
lingyin55 2009-02-25
  • 打赏
  • 举报
回复
mark
heidaizx 2009-02-25
  • 打赏
  • 举报
回复
自己已经改完了
ltc_mouse 2009-02-24
  • 打赏
  • 举报
回复
加密算法没研究过,指出lz代码中的几个错误:

//获取随机密钥
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;
}

关于char,编译器似乎支持指定为有符号或者无符号;如果已指定无符号了,上面指出的某些问题就不存在了,呵呵~
lzh9955 2009-02-24
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
楼主用crypt++或者openSSL吧,自己写多麻烦啊.很多牛人都自己写过类似的库了.
waizqfor 2009-02-24
  • 打赏
  • 举报
回复
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。
RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。假设S-box长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示):
for (i=0; i<n; i++)
s[i]=i;
j=0;
for (i=0; i<n; i++)
{
j=(j+s[i]+k[i])%256;
swap(s[i], s[j]);
}
在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:
i=j=0;
while (明文未结束)
{
++i%=n;
j=(j+s[i])%n;
swap(s[i], s[j]);
sub_k=s((s[i]+s[j])%n);
}
得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。关于如何破解xor加密,请参看Bruce Schneier的Applied Cryptography一书的1.4节Simple XOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是否会出现重复呢?经过我的测试,存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。
而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!
pengzhixi 2009-02-24
  • 打赏
  • 举报
回复
mark
太乙 2009-02-24
  • 打赏
  • 举报
回复
upup~~
killbug2004 2009-02-24
  • 打赏
  • 举报
回复
j = (j + src[i] + m_box[i]) % 256; 貌似这一句j=-3的时候内存访问出错

贴一个别人的代码
#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;
}


内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧