• WinSocket编程笔记(三)


    二.Kerberos协议的实现

    现有Alice、AS、TGS、Bob,实现Alice和Bob的安全密钥交换

    这里只实现Alice和AS之间的通信

    我把各个部分的代码拆开来写:

    1.随机会话密钥生成

    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    int main()
    {   srand((unsigned)time(NULL));
        int key=(rand()%9000+1000);
        cout << key << endl;
        return 0;
    }

    2.加密算法

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {   string plain="ada54ff89m";
        string cipher="";
        int key=89696;
        int offset = key % 26;
        for(int i = 0; i < plain.length(); i++)
        {   char c = plain[i];
            if(isalpha(c))
            {
                if(c >= 'a' && c <= 'z')
                {
                    c = 'a' + ((c - 'a' + offset) % 26);
                    cipher += c;
            }
            else
            {
                    c = 'A' + ((c - 'A' + offset) % 26);
                    cipher += c;
            }}
    
            else if(isdigit(c))
                {
                    c = '0' + ((c - '0' + offset) % 10);
                    cipher += c;
                }
                else
                {
                    cipher += c;
                }
        }
        cout<<cipher<<endl;
        }

    3.解密算法

    #include <iostream>
    #include<cstring>
    using namespace std;
    
    int main()
    {   int key=89659;
        string plain ="";
        string cipher="wsw0lmm";
        int offset = key % 26;
        for(int i = 0; i < cipher.length(); i++)
        {
            char c = cipher[i];
            if(isalpha(c))
            {
                if(c >= 'a' && c <= 'z')
                {
                    c = 'z' - (('z' - c + offset) % 26);
                    plain += c;
                }
                else
                {
                    c = 'Z' - (('Z' - c + offset) % 26);
                    plain += c;
                }
            }
            else if(isdigit(c))
                {
                    c = '9' - (('9' - c + offset) % 10);
                    plain += c;
                }
                else
                {
                    plain += c;
                }
        }
        cout<<plain<<endl;
    }

    4.map属性读取内容(对应主密钥)//后来实际操作的时候还是定义了map<string,string>,省去了int转string

    #include <fstream>
    #include <string>
    #include <iostream>
    #include<map>
    using namespace std;
    
    int main()
    {
        map<string,int> userHash;
        userHash["ALICE"]=12345;
        userHash["BOB"]=23456;
        userHash["AS"]=34567;
        userHash["TGS"]=45678;
        int TGSkey = userHash.find("TGS")->second;
        cout<<TGSkey<<endl;
        return 0;
    }

    然后就是结合之前的服务器代码,修改合并,之间好几次又要做到类型转换,否则会出错

    服务器端主要代码:

        if(*a==*secret)//存储空间位置不同,不能直接比较,验证ALICE主密钥是否和发来的密钥相同
        {   cout<<"验证成功"<<endl;
            //AS主密钥加密ALICE用户名和随机会话密钥
            //int转string,KSkey -> KKSkey
            char t[256];
            string KKSkey;
            sprintf(t, "%d", KSkey);
            KKSkey = t;
            cout<<"KSkey:"<<KKSkey<<endl;
            string plain=name+KKSkey;
            cout<<"明文:"<<plain<<endl;
            string cipher="";
            int offset = 34567 % 26;
            for(int i = 0; i < plain.length(); i++)
            {   char c = plain[i];
                if(isalpha(c))
                {
                    if(c >= 'a' && c <= 'z')
                    {
                        c = 'a' + ((c - 'a' + offset) % 26);
                        cipher += c;
                }
                else
                {
                        c = 'A' + ((c - 'A' + offset) % 26);
                        cipher += c;
                }}
    
                else if(isdigit(c))
                    {
                        c = '0' + ((c - '0' + offset) % 10);
                        cipher += c;
                    }
                    else
                    {
                        cipher += c;
                    }
            }
            //string转char,cipher -> p
            char p[100];
            int i;
            for( i=0;i<cipher.length();i++)
            {
                p[i] = cipher[i];
            }
            p[i] = '';
            cout<<"密文TGT:"<<p<<endl;
            //ALICE主密钥加密随机会话密钥
            string plain2=KKSkey;
            string cipherr="";
            int offset2 = 12345 % 26;
            for(int i = 0; i < plain2.length(); i++)
            {   char c2 = plain2[i];
                if(isalpha(c2))
                {
                    if(c2 >= 'a' && c2 <= 'z')
                    {
                        c2 = 'a' + ((c2 - 'a' + offset2) % 26);
                        cipherr += c2;
                }
                else
                {
                        c2 = 'A' + ((c2 - 'A' + offset2) % 26);
                        cipherr += c2;
                }}
    
                else if(isdigit(c2))
                    {
                        c2 = '0' + ((c2 - '0' + offset2) % 10);
                        cipherr += c2;
                    }
                    else
                    {
                        cipherr += c2;
                    }
            }
            //string转char,cipherr -> p2
            char p2[100];
            int i2;
            for( i2=0;i2<cipherr.length();i2++)
            {
                p2[i2] = cipherr[i2];
            }
            p2[i2] = '';
            cout<<"ALICE主密钥加密的KSkey:"<<p2<<endl;
            //ALICE主密钥加密TGT
            string plain3=cipher;
            string cipherrr="";
            int offset3 = 12345 % 26;
            for(int i3 = 0; i3 < plain3.length(); i3++)
            {   char c3 = plain3[i3];
                if(isalpha(c3))
                {
                    if(c3 >= 'a' && c3 <= 'z')
                    {
                        c3 = 'a' + ((c3 - 'a' + offset3) % 26);
                        cipherrr += c3;
                }
                else
                {
                        c3 = 'A' + ((c3 - 'A' + offset3) % 26);
                        cipherrr += c3;
                }}
    
                else if(isdigit(c3))
                    {
                        c3 = '0' + ((c3 - '0' + offset3) % 10);
                        cipherrr += c3;
                    }
                    else
                    {
                        cipherrr += c3;
                    }
            }
            //string转char,cipherrr -> p3
            char p3[100];
            int i4;
            for( i4=0;i4<cipherrr.length();i4++)
            {
                p3[i4] = cipherrr[i4];
            }
            p3[i4] = '';
            cout<<"ALICE主密钥加密以后的TGT:"<<p3<<endl;
        }

    客户端代码基本上没有变化,这里就不贴上了

    运行结果(因为不是同一次运行截图,所以结果不一样):

    服务器端:

    客户端:

    收到信息:

    (待续)

    [Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你
  • 相关阅读:
    Ubuntu下 实现Linux与Windows的互相复制与粘贴
    bzoj2426
    bzoj1835
    bzoj1197
    bzoj1049
    bzoj2893
    bzoj1820
    bzoj1819
    bzoj1455
    bzoj3689
  • 原文地址:https://www.cnblogs.com/echoDetected/p/12666945.html
Copyright © 2020-2023  润新知