[C++搞事代码] ED字符串加密解密

[C++搞事代码] ED字符串加密解密

#include<bits/stdc++.h>
using namespace std;

/*
    ed_encrypt法
    src: 明文
    key: 密码
    jz: 数据进制
    encode: 是否变成16进制编码
*/
string ed_encrypt(string src,string key,int jz=128,bool encode=true)
{
    y:;
    if(key=="") key=" "; //以防崩溃
    string k2(src.length(),' ');
    for(int i=0;i<k2.length();i++)
    {
        k2[i]=key[i%key.length()];
    }

    s:;
    for(int i=0;i<k2.length();i++)
    {
        int x=src[i];
        if(i!=0) x+=src[i-1];
        x+=k2[i];
        while(x>=jz) x-=jz;
        src[i]=x; 
    }

    c:;
    char codes[100]="0123456789abcdef";
    if(encode)
    {
        string ec(src.length()*2,'_');
        for(int i=0;i<src.length();i++)
        {
            ec[2*i]=codes[src[i]/16];
            ec[2*i+1]=codes[src[i]%16];
        }
        return ec;
    }

    e:;
    return src;
}

/*
    ed_decrypt法
    src: 密文
    key: 密码
    jz: 数据进制
    decode: 解码16进制
*/
string ed_decrypt(string ec,string key,int jz=128,bool decode=true)
{
    c:;
    string src;
    if(decode)
    {
        string tmp(ec.length()/2,'_');
        for(int i=0;i<tmp.length();i++)
        {
            int a=ec[i*2];
            if(isdigit(a)) a-='0';
            else a=a-'a'+10;
            int b=ec[i*2+1];
            if(isdigit(b)) b-='0';
            else b=b-'a'+10;
            tmp[i]=a*16+b;
        }
        src=tmp;
    }
    else src=ec;

    y:;
    if(key=="") key=" "; //以防崩溃
    string k2(src.length(),' ');
    for(int i=0;i<k2.length();i++)
    {
        k2[i]=key[i%key.length()];
    }

    s:;
    for(int i=k2.length()-1;i>=0;i--)
    {
        int x=src[i];
        if(i!=0) x-=src[i-1];
        x-=k2[i];
        while(x<0) x+=jz;
        src[i]=x; 
    }

    e:;
    return src;
}

int main()
{
    int T;
    scanf("%d",&T);
    cout<<endl;
    while(T--)
    {
        int mode;
        string laji;
        scanf("%d",&mode);
        getline(cin,laji);
        if(mode==1)
        {
            string data,key;
            getline(cin,data);
            getline(cin,key);
            cout<<ed_encrypt(data,key,128,true)<<endl<<endl;
        }
        else if(mode==-1)
        {
            string data,key;
            getline(cin,data);
            getline(cin,key);
            cout<<ed_decrypt(data,key,128,true)<<endl<<endl;
        }
        else cout<<"Invalid type!\n"<<endl;
    }
}

 

没有评论

添加评论

我们将在300年后停止对游客评论的支持。请尽快注册或登录
本站现已支持评论使用Markdown来发挥个性。Markdown说明