當前位置:首頁 » 編程語言 » 古老的密碼c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

古老的密碼c語言

發布時間: 2022-07-24 06:58:47

❶ 古代最古老的密碼古代人是怎麼破解的

公元前405年,雅典和斯巴達之間的伯羅奔尼撒戰爭已進入尾聲。斯巴達軍隊逐漸占據了優勢地位,准備對雅典發動最後一擊。這時,原來站在斯巴達一邊的波斯帝國突然改變態度,停止了對斯巴達的援助,意圖是使雅典和斯巴達在持續的戰爭中兩敗俱傷,以便從中漁利。在這種情況下,斯巴達急需摸清波斯帝國的具體行動計劃,以便採取新的戰略方針。正在這時,斯巴達軍隊捕獲了一名從波斯帝國回雅典送信的雅典信使。斯巴達士兵仔細搜查這名信使,可搜查了好大一陣,除了從他身上搜出一條布滿雜亂無章的希臘字母的普通腰帶外,別無他獲。情報究竟藏在什麼地方呢?斯巴達軍隊統帥萊桑德把注意力集中到了那條腰帶上,情報一定就在那些雜亂的字母之中。他反復琢磨研究這些天書似的文字,把腰帶上的字母用各種方法重新排列組合,怎麼也解不出來。最後,萊桑德失去了信心,他一邊擺弄著那條腰帶,一邊思考著弄到情報的其他途徑。當他無意中把腰帶呈螺旋形纏繞在手中的劍鞘上時,奇跡出現了。原來腰帶上那些雜亂無章的字母,竟組成了一段文字。這便是雅典間諜送回的一份情報,它告訴雅典,波斯軍隊准備在斯巴達軍隊發起最後攻擊時,突然對斯巴達軍隊進行襲擊。斯巴達軍隊根據這份情報馬上改變了作戰計劃,先以迅雷不及掩耳之勢攻擊毫無防備的波斯軍隊,並一舉將它擊潰,解除了後顧之憂。隨後,斯巴達軍隊回師征伐雅典,終於取得了戰爭的最後勝利。 雅典間諜送回的腰帶情報,就是世界上最早的密碼情報,具體運用方法是,通信雙方首先約定密碼解讀規則,然後通信—方將腰帶(或羊皮等其他東西)纏繞在約定長度和粗細的木棍上書寫。收信—方接到後,如不把腰帶纏繞在同樣長度和粗細的木棍上,就只能看到一些毫無規則的字母。後來,這種密碼通信方式在希臘廣為流傳。現代的密碼電報,據說就是受了它的啟發而發明的。 「密碼」一詞對人們來說並不陌生,人們可以舉出許多有關使用密碼的例子。如保密通信設備中使用「密碼」,個人在銀行取款使用「密碼」,在計算機登錄和屏幕保護中使用「密碼」,開啟保險箱使用「密碼」,兒童玩電子游戲中使用「密碼」等等。這里指的是一種特定的暗號或口令字。現代的密碼已經比古代有了長遠的發展,並逐漸形成一門科學,吸引著越來越多的人們為之奮斗。

歷史上最早的有記錄的密碼術應用大約是在公元前5世紀。那個時候古希臘的斯巴達人使
用一種叫作scytale的棍子來傳遞加密信息。在scytale上斯巴達人會呈螺旋形地纏繞上一
條羊皮紙或皮革。發信人在纏繞的羊皮紙上橫著寫下相關的信息然後將羊皮紙取下這樣
羊皮紙上就是一些毫無意義的字母順序。如果要將這條消息解碼收件人只要將羊皮紙再次
纏繞在相同直徑的棍棒上這樣就可以讀出信件的內容了。

c語言密碼程序

用一個文本文件或小資料庫存儲這些東西,比如,XML或SQLIITE等等,也可以用普通文本,存儲進去之後,下次打開輸入的時候,和新存入的密碼進行匹配,如果沒有匹配成功,失敗。另外,為了密碼的安全問題,一般會有一個MD5或者其他SHA演算法進行加密下

❸ c語言編寫hill密碼

// 希爾演算法的加密與解密
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <memory.h>// nDime為全部變數,可逆矩陣的維數
int nDime;
int index = 0;// MAXN為明文的最大長度
const int MAXN = 256;// 矩陣相乘,a是一個列為1的矩陣
void MultiplyMatrix(int a[], int b[][10], int *text)
{
int i, j, t; for (i = 0; i < nDime; i++)
{
t = 0;
for (j = 0;j < nDime; j++)
t += b[i][j] * a[j];
text[index++] = t;
}
}// 求行列式的值
int determinant(int m[][10], int size)
{
int row, column;
int temp1[10], temp2[10], t; for (column = 0; column < size; column++)
{
temp1[column] = m[0][column];
temp2[column] = m[0][column];
}
for (row = 1; row < size; row++)
{
for (column = 0; column < size; column++)
{
int diff = column - row;
int sum = column + row;
if (diff < 0)
diff += size;
if (sum >= size)
sum %= size;
temp1[diff] *= m[row][column];
temp2[sum] *= m[row][column];
}
}
t = 0;
for (row = 0; row < size; row++)
t += temp1[row] - temp2[row]; return t;
}// 求矩陣中某一元素的代數餘子式
int func(int matrix[][10], const int i, const int j)
{
int row, column, m, n;
int NewMatrix[10][10]; m = n = 0;
for (row = 0; row < nDime; row++)
{
if (i == row)
continue;
for (column = 0; column < nDime; column++)
{
if (j == column)
continue;
NewMatrix[m++][n++] = matrix[row][column];
}
}

printf ("New Array:\n");
for (row = 0; row < nDime - 1; row++)
{
for (column = 0; column < nDime - 1; column++)
printf("%d ", NewMatrix[row][column]);
printf("\n");
} int sign = (!((i + j) % 2)) ? 1 : -1;
return sign * determinant(NewMatrix, nDime - 1);
}// 對矩陣求逆,cm矩陣與m矩陣互逆
void ConverseMatrix(int m[][10], int cm[][10])
{
// 矩陣求逆,利用數學公式A(逆)= (1 / |A|)乘以A*
// 其中,|A|表示行列式A的值,而A*表示矩陣A的伴隨矩陣
int row, column;
int StarMat[10][10]; // StarMat表示m的伴隨矩陣
int t; // 初始化伴隨矩陣
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
StarMat[row][column] = 0; // 求伴隨矩陣
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
{
StarMat[row][column] = func(m, row, column);
printf("伴隨矩陣:%d", StarMat[row][column]);
} // 求行列式的值
t = determinant(m, nDime); // 求出逆向矩陣
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
cm[row][column] = StarMat[row][column] / t;
// 輸出逆向矩陣
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
printf("%d ", cm[row][column]);
printf("\n");
}// 希爾加密及解密演算法
void ShellPassword(int *OText, int TextLen, int matrix[][10], int *text)
{
int i, j, n, a[10];

// 判斷要將OText分成幾部分
n = TextLen / nDime;
if (TextLen % nDime)
n++; // 矩陣相乘
// 將OText分成的幾部分分別與matrix矩陣相乘
for (i = 0; i < n; i++)
{
for (j = 0; j < 10; j++)
a[j] = 0;
for (j = 0; j < nDime; j++)
a[j] = OText[i * nDime + j];
MultiplyMatrix(a, matrix, text);
}
}
int main(void)
{
int i, temp, row, column;
// matrix存放加密或解密矩陣,Password為加密後的結果
// OText存放原文轉換為普通數字,如A~1,Z~26
int matrix[10][10], ConMatrix[10][10], OText[MAXN], Password[MAXN], OriText[MAXN];
char text[MAXN];
char sel; printf("=================================================\n");
putchar('\n');
printf(" SHELL加密解密器\n");
putchar('\n');
printf("=================================================\n"); while (1)
{
// 初始化矩陣
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
matrix[row][column] = 0; putchar('\n');
printf("1.加密\n");
printf("2.解密\n");
printf("0.退出\n");
printf("請輸入你的選擇:\n");
sel = getche(); switch (sel)
{
case '1':
printf("\n請輸入原文:\n");
memset(text, '\0', sizeof(text) / sizeof(char));
memset(Password, 0, sizeof(Password) / sizeof(int));
gets(text); printf("輸入加密矩陣的維數,維數不能超過10維:\n");
scanf("%d", &nDime);
printf("輸入矩陣,該矩陣必須為可逆矩陣,否則將不能進行解密:\n");
// 可逆矩陣即,設A為n階矩陣,如果存n在階矩陣B使得AB=BA=1
// 則矩陣A是可逆的,稱B是A的逆矩陣
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
scanf("%d", &matrix[row][column]);
// 將小寫字母轉換為大寫字母
for (i = 0; text[i] != '\0'; i++)
if (islower(text[i]))
text[i] |= 0x20;
// OText存放將字母轉換為相應數,如A~1,Z~26
for (i = 0; i < MAXN; i++)
OText[i] = 0;
for (i = 0; text[i] != '\0'; i++)
OText[i] = text[i] - 'A' + 1;
// 加密
ShellPassword(OText, strlen(text), matrix, Password);
// 將加密後的內容列印出來
printf("加密後的內容為:\n");
for (i = 0; i < strlen(text); i++)
printf("%d ", Password[i]);
putchar('\n');
break;
case '2':
break;
case '0':
return 0;
default:
break;
}
getchar();
} return 0;
} 解碼演算法我會在明天上傳上來,你的加密密鑰是一個三階的數組,密文C是:1729 2514 811 1659 2472 858 1739 2514 849 1902 2736 905 1659 2472 858

❹ C語言密碼輸入

簡單的

用一個字元數組來存密碼

再用一個字元數組接收你的輸入,然後用strcmp

來比較,如果返回0則密碼是正確的

#include"stdio.h"

#include"string.h"

intmain()

{

charmima[100]="YuanShi888";

charinput[100]={0};

printf("請輸入密碼:");

gets(input);

if(strcmp(mima,input)==0)

printf("恭喜你,密碼正確! ");

else

printf("對不起,密碼輸入錯誤! ");

}

❺ c語言 密碼電文

不好意思,剛才寫的程序有點錯誤:現更正如下:(請編譯人員不要刪除!)

#include <stdio.h>
#include <string.h>
#define N 100
void main()
{
char s[N];
int i;
int a;
printf("Input String:");
scanf("%s",s);
for(i=0;i<=strlen(s);i++)
{
if(s[i]>='A'&&s[i]<='Z')
s[i]=26-s[i]+64+1+64;
else if(s[i]>='a'&&s[i]<='z')
s[i]=26-s[i]+96+1+96;
}
printf("%s\n",s);
}

❻ 密碼鎖c語言編程代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
intmain()
{
charpassword[10],password2[10];
memset(password,0,sizeof(password));
memset(password2,0,sizeof(password2));
printf("請設置8位數以內密碼: ");
scanf("%s",password);
printf("請設置校驗密碼: ");
scanf("%s",password2);
if(atoi(password2)==atoi(password))
{
printf("密碼輸入正確!: ");
}
else
{
printf("密碼輸入錯誤!: ");
}
return0;
}

❼ C語言簡單密碼破解(密文轉明文)

調了半天,樓主真是太粗心了!middle1[]應該這樣聲明:
char
middle1[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
最後輸出start的時候要注意控制長度,改個for循環就好了!
#include<stdio.h>
#include<string.h>
int
main(void)
{
int
i,j,length,n;
char
temp;
char
middle2[27];
char
start[201],finish[201];
char
middle1[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
gets(middle2);
gets(finish);
scanf("%d",&n);
length=strlen(finish);
for(i=0;i<25;i++)
{
for(j=i+1;j<26;j++)
{
if(middle2[i]>middle2[j])
{
temp=middle2[i];
middle2[i]=middle2[j];
middle2[j]=temp;
temp=middle1[i];
middle1[i]=middle1[j];
middle1[j]=temp;
}
}
}
for(i=1;i<=n;i++)
{
for(j=0;j<length;j++)
{
if(finish[j]=='
')
{
start[j]='
';
}
else
{
start[j]=middle1[finish[j]-'A'];
}
}
}
for(
i
=
0;i
<
length;++i)
printf("%c",start[i]);
printf("\
");
return
0;
}
/*
ABCDEFGHIJKLMNOPQRSTUVWXYZ
*/

❽ c語言密碼

  1. 用什麼替換?

  2. 暫時用小寫加移位取?比如A加密成c,B加密成d,就是大寫變小寫後位置發生變化。



#include <stdio.h>
#include <string.h>
#include <ctype.h>

void EncodeString(char *str,int key)
{
int length,i;//length為傳入字元串長度,i用作循環計數器
length=strlen(str);
for(i=0;i<length;i++)//對字元串中的每個字元依次進行加密
{
if(isupper(str[i]))//對大寫字母加密
{
str[i]+=key%26;
if(str[i]>'Z')
{
str[i]-=26;
}
else if(str[i]<'A')
{
str[i]+=26;
}
}
else if(islower(str[i]))//對小寫字母加密
{
if(str[i]+key%26<128){
str[i]+=key%26;
if(str[i]>'z')
{
str[i]-=26;
}
else if(str[i]<'a')
{
str[i]+=26;
}
}
else{str[i]-=26;str[i]+=key%26;}
}

}
}

void main()
{
char arr[50],buffer;//arr[50]用來接收字元串信息,buffer用來接收緩沖區中的回車
int key;//key為加密秘鑰
printf("This program encodes messages using a cyclic cipher. ");
printf("To stop, enter 0 as the key. ");
while(1)//程序一直運行,直到輸入密鑰0為止
{
printf("Enter the key: ");
scanf("%d",&key);
scanf("%c",&buffer);
if(0==key)
{
break;//輸入密鑰為0,則退出程序
}
printf("Enter a message: ");
scanf("%s",arr);
scanf("%c",&buffer);
EncodeString(arr,key);
printf("Encoded message: %s ",arr);
}
}

❾ 求古典密碼學的c語言代碼

給:
維吉尼亞密碼的C語言源代碼
設m表示明文序列,k表示密鑰序列

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void crypt(char m[],char k[],char r[])
{
int i,j,s=0;
j=strlen(k);
for(i=0;m[i];i++)
m[i]=tolower(m[i]);
for(i=0;m[i];i++)
if(isalpha(m[i]))
{
r[i]=(m[i]-'a'+k[s%j]-'a')%26+'a';
s++;/* s用來跳過明文中的空格字元 */
}
else
r[i]=m[i];
r[i]=0;/* 密文字元串結束符 */
for(i=0;r[i];i++)
r[i]=toupper(r[i]);
}

void decrypt(char c[],char k[],char m[])
{
int i,j,s=0;
j=strlen(k);
for(i=0;c[i];i++)
c[i]=tolower(c[i]);
for(i=0;c[i];i++)
if(isalpha(c[i]))
{
m[i]=(c[i]-k[s%j]+26)%26+'a';
s++;
}
else
m[i]=c[i];
m[i]=0;
}

void main()
{
char m[]="welcome to my blog.i am bugeyes.";//我這里是賦值了一個固定的字元串為明文序列,你也可以做成用戶輸入的
char k[]="bugeyeswuyan";//我這里是賦值了一個固定的字元串為密鑰序列,你也可以做成用戶輸入的
char c[80];
char d[80];
system("cls");;
crypt(m,k,c);
decrypt(c,k,d);
puts(m);
puts(k);
puts(c);
puts(d);
}