首页
社区
课程
招聘
[旧帖] [原创]一个上机作业 PlayFair加密 0.00雪花
2011-4-2 19:53 1603

[旧帖] [原创]一个上机作业 PlayFair加密 0.00雪花

2011-4-2 19:53
1603
#include   <iostream>
#include   <string>
#include   <algorithm>
#include         <stdlib.h>
using namespace std;
class Unique{
        string s;
public:
        string get() {return s; }
        string operator()(char c)
        {
                if(s.end() == find(s.begin(), s.end(), c))
                        s += c;
                return s;
        }
};

string myUnique(string& in)
{
        return
                for_each(in.begin(), in.end(), Unique()).get();
}

int main()
{
        string s ;
        cout<<"请输入密钥(仅限英文字母,切勿空格):" ;
        cin>>s ;
        string alphabet(26, 'A') ;
        for (int i = 0, char c = 65 ; i != alphabet.size() ; ++i, ++c)
        {
                alphabet[i] = c ;
        }

        s += alphabet ;                                                         //将输入的密钥加上字母表
        for (string::size_type ind = 0 ; ind != s.size() ; ++ind)               //将整个字符串转化为大写,并改'J'为'I'
        {
                s[ind] = toupper(s[ind]) ;
                if (s[ind] == 'J')
                {
                        s[ind] = 'I' ;
                }
        }

        string str = myUnique(s) ;                                              //去掉重复字母
        cout<<"密钥矩阵为:"<<endl ;
        for (i = 0 ; i != str.size() ; ++i)
        {
                cout<<str[i]<<" " ;
                if((i + 1) % 5 == 0)
                {
                        cout<<endl ;
                }
        }
        char matrix[5][5] = {'A'} ;
        int m = 0, n = 0, k = 0 ;
        for (m = 0 ; m < 5 ; m++)
        {
                for (n = 0 ; n < 5 ; n++)
                {
                        matrix[m][n] = str[k++] ;
                }
        }

        string plain ;
        cout<<"请输入明文(仅限英文字母,切勿空格):" ;
    cin>>plain ;
        int size = plain.size() ;
        for (string ::size_type ii = 0 ; ii < size - 1 ; ii += 2)                //修改明文,使之规范化
        {
                if (plain[ii] == plain[ii + 1])
                {
                        plain.insert(ii + 1, 1, 'x') ;                                   //两个字符相同,添加X
                        size = plain.size() - 1 ;
                }
               
        }
        if (plain.size() % 2 != 0)                                               //使字符成为偶数
        {
                plain += 'x' ;
        }

        int i1, j1, i2, j2 ;
        for (int index = 0 ; index < plain.size() - 1 ; index += 2)
        {
                for (m = 0 ; m < 5 ; m++)
                {
                        for (n = 0 ; n < 5 ; n++)
                        {
                                if (toupper(plain[index]) == matrix[m][n])
                                {
                                        i1 = m ;
                                        j1 = n ;
                                }
                                if (toupper(plain[index + 1]) == matrix[m][n])
                                {
                                        i2 = m ;
                                        j2 = n ;
                                }
                        }
                }
               
                if (i1 == i2)
                {
                        plain[index] = matrix[i1][(j1 + 1) % 5] ;
                        plain[index + 1] = matrix[i1][(j2 + 1) % 5] ;
                }
                if (j1 == j2)
                {
                        plain[index] = matrix[(i1 + 1) % 5][j1] ;
                        plain[index + 1] = matrix[(i2 + 1) % 5][j1] ;
                }
                if (i1 != i2 && j1 != j2)
                {
                        plain[index] = matrix[i1][j2] ;
                        plain[index + 1] = matrix[i2][j1] ;
                }
        }

        cout<<"密文为:"<<plain<<endl ;

        system("pause") ;
       
        return 0 ;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞6
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回