1. 程式人生 > >加密解密(字串處理)

加密解密(字串處理)

標題:加密解密     Playfair密碼由英國人發明,它使用方便而且可以讓頻度分析法失效,直到一戰中才被破譯。
    其一變種方法如下:首先選擇一個金鑰單詞(稱為pair)(剔除重複字母,且都為小寫字母),然後與字母表中其他字母一起填入至一個5x5的方陣中,填入方法如下:
1.首先按行填入金鑰串,重複的字母忽略之。
2.緊接其後,按字母序按行填入不在金鑰串中的字母。
3.由於方陣中只有25個位置,最後剩下的那個字母則不需填入。
如果金鑰為lanqiao,則該方陣如下: 
l a n q i
o b c d e
f g h j k
m p r s t
u v w x y 在加密一對字母時,如da,在方陣中找到以這兩個字母為頂點的矩形。
這對字母的加密字母為該矩形的另一對頂點,如本例中為bq。 請設計程式,使用上述方法對輸入串進行加密,並輸出加密後的串。 另有細則如下:
1、一對一對取字母,如果最後只剩下一個字母,則不變換,直接放入加密串中;
2、如果一對字母中的兩個字母相同,則不變換,直接放入加密串中;
3、如果一對字母中有一個字母不在矩陣中,則不變換,直接放入加密串中;
4、如果字母對出現在方陣中的同一行或同一列,如fk或ky,則只需簡單對調這兩個字母,即變換為kf或yk;
5、如果在正方形中能夠找到以字母對為頂點的矩形,假如字母對為da,則該矩形的另一對頂點字母中,與d同行的字母應在前面,在上例中應是bq;同樣若待變換的字母對為pj,則變換後的字母對應為sg;
6、本程式中輸入串均為小寫字母,並不含標點、空格或其它字元。 解密方法與加密相同,即對加密後的字串再加密,將得到原始串。 輸入格式如下:
輸入為兩行字串,
第一行為金鑰單詞(長度小於等於25),
第二行為待加密字串(長度小於等於50),
兩行字串末尾都有一個回車換行符,
並且,兩行字串均為小寫字母,不含其它字元。 輸出為一行,表示加密後的字串。 例如:
輸入:
lanqiao
dasai 程式應該輸出:
bqpqi
再例如:
輸入:
dasai
lanqiao 程式應該輸出:
ksltaio
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。 所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
java選手注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
java選手注意:主類的名字必須是:Main,否則按無效程式碼處理。 c/c++選手注意: main函式需要返回0
c/c++選手注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
c/c++選手注意: 所有依賴的函式必須明確地在原始檔中 #include <xxx>, 不能通過工程設定而省略常用標頭檔案。 提交程式時,注意選擇所期望的語言型別和編譯器型別。 接觸這題時是藍橋杯的模擬賽,應機器的部分原因導致這題沒能寫完,也為一遺憾,故在此補上
#include<iostream>
#include<string.h>
using namespace std;
char key[5][5];
char zuo1,zuo2;
int key1(char a,char b)
{
	int a1=9,a2=9,b1=9,b2=9;
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			{
				if(a==key[i][j])
					a1=i,a2=j;
				if(b==key[i][j])
					b1=i,b2=j;
			}
	if(a1==9||b1==9)	return 0;//方陣中沒有 直接放 
	if(a==b)	return 0;//a,b相同 直接放 
	if(a1==b1||a2==b2) 
	{
		zuo1=b,zuo2=a;
		return 1;//變換後再放 
	}
	zuo1=key[a1][b2],zuo2=key[b1][a2];
	return 1; 
}
int main()
{
	char r[25],ru[25],chu[50];
	gets(r);
	gets(ru);
	int a=0,i,j;
	while(a!=strlen(r))
	{
		for(i=0;i<a&&r[a]!=r[i];i++);
		if(i!=a)
		for(i=a;r[i]!='\0';i++)
			r[i]=r[i+1];
		a++;
	}
	a=strlen(r);
	char A='a';
	while(a!=25)
	{
		for(i=0;r[i]!='\0'&&A!=r[i];i++);
		if(r[i]=='\0')
		{
			r[a]=A;
			a++;
		}
		A++;
	}
	a=0;
	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
			key[i][j]=r[a++];
	a=0;
	while(a<strlen(ru))
	{
		if(ru[a+1]=='\0')
		{
			chu[a]=ru[a];
		}
		else
		{
			char a1=ru[a],a2=ru[a+1];
			if(key1(a1,a2)) chu[a]=zuo1,chu[a+1]=zuo2;
			else chu[a]=a1,chu[a+1]=a2; 
		}
		a+=2;
		 
	}
	puts(chu);
	return 0;
}