• RC4加密解密算法的简单实现


    今天上午要上信安基础课了,所以在上课之前复习了下

    看到了RC4,就想实现一遍,顺便当作复习咯

    只不过太挫了,有一个地方理解错了

    就是加密解密得用同一个S[]

    这个S[]在加密或者解密的结束之后是改变了的

    我一直没有注意到这个结果,所以一直在悲剧

    下面就上代码了,写的极其的挫,也不想改了,反正已经了解了算法的流程了

    不过这种风格也是我要改变的风格了(觉得之前符号什么的全写一起太难看了。。。)

    注明:s和t数组用int或者char都可以的

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    
    const int maxn=256+10;
    
    void init(char *s, char *t, int len, char *key){
        for(int i = 0; i < maxn; i++){
            s[i] = i;
            t[i] = key[i % len];
        }
        for(int i = 0, j = 0; i < maxn; i++){
            j = (j + s[i] + t[i]) % maxn;
            swap(s[i], s[j]);
        }
    }
    void RC4(char *s, char *data, char *ans){
        int i = 0, j = 0;
        int l = strlen(data);
        //printf("%d\n",l);
        for(int k = 0; k < l; k ++){
            i = (i + 1) % maxn;
            j = (j + s[i]) % maxn;
            swap(s[i], s[j]);
            int t = (s[i] + s[j]) % maxn;
            ans[k] = s[t] ^ data[k];
            cout<<ans[k];
        }
        puts("");
        ans[l] = '\0';
    }
    int main(){
        char key[maxn];
        puts("input key");
        scanf("%s", key);
        char keys[maxn];
        strcpy(keys,key);
        char s[maxn], t[maxn];
        //init(s, t, strlen(key), key);
        while(true){
            init(s, t, strlen(keys), keys);
            puts("select it:");
            puts("1: Encryption");
            puts("2: Decryption");
            int sel;
            scanf("%d", &sel);
            if(sel != 1 && sel != 2) break;
            switch(sel){
                case 1:puts("inputs your message");break;
                case 2:puts("inputs your Ciphertext");
            }
            char data[maxn];
            char ans[maxn];
            //scanf("%s", data);
            getchar();
            gets(data);
            RC4(s, data, ans);
            printf("\n%s\n", ans);
        }
        return 0;
    }
  • 相关阅读:
    updatePanel、自定义控件、弹出提示
    防止csv和excel转义
    随机码的生成
    一个页面多个Form——ajaxform
    Google首页电吉
    Sivlerlight3 向silverlight传递自定义参数
    Java接口测试get请求,使用httpClient获取cookies+携带获取的cookies访问get接口
    Java接口测试post请求,使用httpClient获取cookies+携带获取的cookies访问post接口
    Acess定义过多字段
    无依赖Office资源的导入导出
  • 原文地址:https://www.cnblogs.com/louzhang/p/2490755.html
Copyright © 2020-2023  润新知