| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2269 人关注过本帖
标题:RC4算法和标准结果不一样,大家帮忙看看哪里错了
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:5 
RC4算法和标准结果不一样,大家帮忙看看哪里错了
以下是我自己写的rc4的代码,以"abcdefgh"为密钥和明文,结果是  3364d84e0e72bfdc
openssl里的rc4,以"abcdefgh"为密钥和明文,结果是 3065df4f0d73b0b4
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


#define N 256
#define Bufsize 1024
unsigned char Box_256[N];
unsigned char Key_256[N];

void usage(void);
void Init();
void Init_Box_256();
void Init_Key_256();
void Encrypt();
unsigned char GetKey(int i);
template  <typename T>
void Swap(T &a,T &b);


int main()
{
    usage();
    Init();
    Encrypt();
    system("pause");
    return 0;
}

void usage(void)
{
    printf(" hahaha  \n");

}

void Init()
{
    Init_Key_256();
    Init_Box_256();
//    return 0;
}
void Init_Box_256()
{
    int i,j;
    for(i=0;i<N;i++)//填充0-255
        Box_256[i]=i;
    for(i=0,j=0;i<N;i++)//按算法交换
    {
        j=(j+Box_256[i]+Key_256[i])%N;
        Swap(Box_256[i],Box_256[j]);
    }
}
void Init_Key_256()
{
    int i,len;
    unsigned char *Key;
    Key=(unsigned char *)malloc(sizeof(unsigned char)*Bufsize);
    printf("Please input the Key:");
    scanf("%s",Key);
    len=strlen((const char *)Key);
//    j=strlen(Key);
    while(len>N)
    {
        printf("too long for Key\n.Please input the Key:");
        memset(Key,0,Bufsize);
        scanf("%s",Key);
        len=strlen((const char *)Key);
    }

    for(i=0;i<N;i++)//密钥填充满256字节
        Key_256[i]=Key[i%len];

    free(Key);
    printf("11\n");
}
template  <typename T>
void Swap(T &a,T &b)
{
    T temp;
    temp=a;
    a=b;
    b=temp;
}

void Encrypt()
{

    int i,j,k,len;
    unsigned char Key_temp;
    unsigned char *ming;
    ming=(unsigned char *)malloc(sizeof(unsigned char)*Bufsize);
    printf("input data for encrypt:");
    scanf("%s",ming);
    len=strlen((const char *)ming);
    for(i=0,j=0,k=0;k<len;k++)
    {
        //        GetKey[k]
        i=(i+1)%N;
        j=(j+Box_256[i])%N;
        Swap(Box_256[i],Box_256[j]);
        Key_temp=(Box_256[i]+Box_256[j])%N;
        Key_temp=Box_256[Key_temp];

        printf("%02x",ming[i]^Key_temp);
    }
    free(ming);
}

void Decrypt()
{
    Encrypt();
}




搜索更多相关主题的帖子: 左右 
2016-06-21 13:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
你的代码中有引用,有模板,这是C语言代码吧?!

你的代码中与问题无关的代码太多,提问时应当剔除,不浪费别人的时间是一种基本的道德;
你的代码运行时需要用户输入,提问时应当避免,不浪费别人的时间是一种基本的道德。
于是,我将你的代码改了一下,输出结果竟然直接就是你期待的那个3065df4f0d73b0b4,难道这就是传说中的“有德者,天佑之”
程序代码:
#include <stdio.h>
#include <string.h>

void Swap( unsigned char* a, unsigned char* b )
{
    unsigned char t = *a;
    *a = *b;
    *b = t;
}

int main( void )
{
    const char* key = "abcdefgh";
    const char* data = "abcdefgh";

    #define N 256

    unsigned char Key_256[N];
    {
        const size_t len = strlen( key );
        for( size_t i=0; i!=N; ++i )
            Key_256[i] = key[i%len];
    }

    unsigned char Box_256[N];
    {
        for( size_t i=0; i!=N; ++i )
            Box_256[i] = i;

        for( size_t i=0,j=0; i!=N; ++i )
        {
            j = (j+Box_256[i]+Key_256[i])%N;
            Swap( Box_256+i, Box_256+j );
        }
    }

    // encrypt
    {
        const size_t len = strlen( data );
        for( size_t i=0,a=0,b=0; i!=len; ++i )
        {
            a = (a+1)%N;
            b = (b+Box_256[a])%N;
            Swap( Box_256+a, Box_256+b );
            unsigned char tmp = Box_256[ (Box_256[a]+Box_256[b])%N ];

            printf( "%02hhx", data[i]^tmp );
        }
    }

    #undef N

    return 0;
}

2016-06-21 15:23
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 rjsp
谢谢。以后一定会注意。
2016-06-21 23:15
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 rjsp
请问版主,为什么临时变量用size_t,而不是一般的int之类的。
2016-06-21 23:36
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 rjsp
脑子进水了。。。size_t就是unsigned int...
2016-06-21 23:38
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
最后问题还是算法在实现上的问题。

问题出在加(解)密部分

这是我的实现:
程序代码:
for(i=0,j=0,k=0;k<len;k++)
    {
        //        GetKey[k]
        i=(i+1)%N;
        j=(j+Box_256[i])%N;
        Swap(Box_256[i],Box_256[j]);
        Key_temp=(Box_256[i]+Box_256[j])%N;
        Key_temp=Box_256[Key_temp];

        printf("%02x",ming[i]^Key_temp);
    }


这是版主的实现:
程序代码:
for( size_t i=0,a=0,b=0; i!=len; ++i )
        {
            a = (a+1)%N;
            b = (b+Box_256[a])%N;
            Swap( Box_256+a, Box_256+b );
            unsigned char tmp = Box_256[ (Box_256[a]+Box_256[b])%N ];

            printf( "%02hhx", data[i]^tmp );
        }


把我的那个printf里的下标从i改成k,就对了。
2016-06-21 23:52
快速回复:RC4算法和标准结果不一样,大家帮忙看看哪里错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019922 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved