當前位置:首頁 » 操作系統 » 凱撒解密演算法

凱撒解密演算法

發布時間: 2022-05-23 02:28:30

『壹』 凱撒加密解密演算法問題 c語言描述

你這語句有問題吧?
#include<stdio.h>
main()
{ char i;
int n;
scanf("%d",&n);
printf("Input your word:");
while(1)
{ i=getchar();
if(i!='\0')
printf("%c",i+n);
else break;
}
} 這個是密鑰自己輸入的

『貳』 網路安全凱撒密碼的計算方法。

凱撒密碼關鍵的是密匙,密匙也就是一個數字,比如說密匙是1,那對英文單詞book這個單詞加密,結果就是相應的每個字母在字母表中的序號減去1,比如b在英文單詞里排第二位,那加密後就是a,o加密後就是n,依此類推,book加密後就是annj,解密時每個字母的順序號加1,所對應的字母就是密文。

『叄』 凱撒演算法的問題

第一次回答可獲2分,答案被採納可獲得懸賞分和額外20分獎勵。#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define MAX_SIZE 100 /*最大字元數*/

void encrypt()
/*加密演算法*/
{
char code[MAX_SIZE] = "\0";
int j= 0, k = 0;

printf("\n請輸入明文:\n");
fflush(stdin);

gets(code);
printf("\n請輸入密鑰:");
scanf("%d", &k);

while(code[j] != '\0')
{
if(code[j] >= 'a' &&code[j] <= 'z')
//小寫字母加密
{
code[j] = (code[j]-'a'+k)%26+'a';
}
else if(code[j] >= 'A' &&code[j] <= 'Z')
//大寫字母加密
{
code[j] = (code[j]-'A'+k)%26+'A';
}
j++;

}
printf("\n對應的密文:\n%s\n", code);
}

void decrypt()
/*解密演算法*/
{
char code[MAX_SIZE] = "\0";
int j= 0, k = 0;

printf("\n請輸入密文:\n");
fflush(stdin);

gets(code);
printf("\n請輸入密鑰:");
scanf("%d", &k);

while(code[j] != '\0')
{
if(code[j] >= 'a' &&code[j] <= 'z')
//小寫字母解密
{
code[j] = (code[j]-'a'-k+26)%26+'a' ;
}
else if(code[j] >= 'A' &&code[j] <= 'Z')
//大寫字母解密
{
code[j] = (code[j]-'A'-k+26)%26+'A' ;
}
j++;

}
printf("\n對應的明文:\n%s\n", code);
}

void main(void)
{

int flag = 1;

while(flag)
{
printf("\n請選擇:\n1.加密;\n2.解密;\n0.退出;\n");
scanf("%d", &flag);

switch(flag)
{
case 1:
encrypt();/*加密函數*/
break;

case 2:
decrypt();/*解密函數*/
break;
default :
break;
}
}
}

運行過程如下:

『肆』 用java 編寫一個凱撒加密和解密

import java.util.Scanner;

public class Caeser {
private String table; // 定義密鑰字母表
private int key; // 定義密鑰key
public Caeser(String table, int key) {
// 根據不同的字母表和不同的密鑰生成一個新的凱撒演算法,達到通用的目的
super();
this.table = table;
this.key = key;
}
public String encrypt(String from) {
//凱撒加密演算法,傳入明文字元串,返回一個密文字元串
String to = "";
for (int i = 0; i < from.length(); i++) {
to += table.charAt((table.indexOf(from.charAt(i))+key)%table.length());
}
return to;
}

public static void main(String[] args) {
Caeser caeser = new Caeser("abcdefghijklmnopqrstuvwxyz", 3);
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要加密的字元串");
String str =scanner.nextLine(); //輸入字元串 security
String result = caeser.encrypt(str); //調用加密方法進行加密
System.out.print(result); // 可得結果 vhfxulwb
}
}

『伍』 誰懂計算機的凱撒碼 我想知道怎麼代換

這里有方法,自己看吧,比較多,呵呵
[凱撒介紹]

凱撒密碼(kaiser)是羅馬擴張時期朱利斯"凱撒(Julius Caesar)創造的,用於加密通過信使傳遞的作戰命令。它將字母表中的字母移動一定位置而實現加密。

[加密原理]

凱撒密碼的加密演算法極其簡單。其加密過程如下:
在這里,我們做此約定:明文記為m,密文記為c,加密變換記為E(k1,m)(其中k1為密鑰),解密變換記為D(k2,m)(k2為解密密鑰)(在這里k1=k2,不妨記為k)。凱撒密碼的加密過程可記為如下一個變換:
c≡m+k mod n (其中n為基本字元個數)
同樣,解密過程可表示為:
m≡c+k mod n (其中n為基本字元個數)
對於計算機而言,n可取256或128,m、k、c均為一個8bit的二進制數。顯然,這種加密演算法極不安全,即使採用窮舉法,最多也只要255次即可破譯。當然,究其本身而言,仍然是一個單表置換,因此,頻率分析法對其仍是有效的。

[加密演算法]

我們預定義基本字元個數為 #define MAX 128
凱撒加密函數可以表示為

[Copy to clipboard]
CODE:
char cipher(char plain_char, int key)
{
return (plain_char + key) % MAX;
};

凱撒解密函數:

[Copy to clipboard]
CODE:
char decipher(char cipher_char, int key)
{
return (cipher_char - key + MAX) % MAX;
};

加密後,原所有的ASCII碼偏移key位,解密則移回key位。
如果要對一個文本文件進行加密,則只要依次逐個字元逐個字元地讀取文本文件,進行加密後,逐個字元逐個字元寫入密文文本文件中,即可:

[Copy to clipboard]
CODE:
FILE *fp_plaintext;
FILE *fp_ciphertext;
char plain_char;
... ...
while((plain_char=fgetc(fp_plaintext))!=EOF)
{
fputc(cipher(plain_char,key),fp_ciphertext);
}

對文件的解密也同樣方法。

[破解原理]

一篇包含字元的英文文章,其各ASCII碼字元出現,都有一定的頻率,下面是對Google上隨意搜索到的英文文章進行分析的結果,見表:

QUOTE:
=================================================
FileName : 01.txt

[1] 32: times:204
[2] 101:e times:134
[3] 116:t times:91
[4] 105:i times:87
[5] 111:o times:77
[6] 108:l times:75
[7] 97:a times:75
[8] 110:n times:69
[9] 10:
times:67
[10] 115:s times:63

=================================================
FileName : php.si.source.txt

[1] 32: times:576
[2] 101:e times:162
[3] 115:s times:153
[4] 110:n times:141
[5] 114:r times:138
[6] 105:i times:135
[7] 10:
times:134
[8] 116:t times:129
[9] 42:* times:116
[10] 111:o times:103

=================================================
FileName : work.txt

[1] 32: times:51322
[2] 101:e times:30657
[3] 116:t times:23685
[4] 97:a times:19038
[5] 111:o times:17886
[6] 105:i times:16156
[7] 110:n times:15633
[8] 114:r times:15317
[9] 115:s times:15226
[10] 104:h times:12191

=================================================
FileName : 02.txt

[1] 32: times:299
[2] 101:e times:217
[3] 110:n times:136
[4] 105:i times:133
[5] 111:o times:124
[6] 116:t times:116
[7] 97:a times:110
[8] 115:s times:98
[9] 114:r times:92
[10] 108:l times:82

=================================================
FileName : 03.txt

[1] 45:- times:404
[2] 32: times:394
[3] 101:e times:237
[4] 116:t times:196
[5] 114:r times:173
[6] 97:a times:163
[7] 105:i times:161
[8] 110:n times:153
[9] 111:o times:142
[10] 115:s times:129

=================================================
FileName : 04.txt

[1] 32: times:326
[2] 101:e times:179
[3] 116:t times:106
[4] 105:i times:101
[5] 111:o times:96
[6] 110:n times:94
[7] 97:a times:92
[8] 115:s times:78
[9] 100:d times:61
[10] 114:r times:60

=================================================
FileName : 05.txt

[1] 32: times:441
[2] 101:e times:191
[3] 111:o times:151
[4] 116:t times:120
[5] 97:a times:112
[6] 110:n times:108
[7] 105:i times:91
[8] 114:r times:84
[9] 117:u times:79
[10] 115:s times:79

有此分析可知,一篇英文文章中,出現較高頻率的兩個字元是 ' ' (空格) 和 'e',而且它們的ASCII碼分別是32和101,差值是69。
既然凱撒密碼利用的是單表替換的一種簡單加密演算法,所以,我們的主角, ' ' 和 'e' ,在解密後,依然會保持相同的ASCII碼差值,69。

|c1 - c2| = |'e' - ' '| = |101 - 32| = 69
|m1 - m2| = | ((c1 + k) mod 256)-((c2 + k) mod 256)| = |c1 - c2| = |'e' - ' '| = 69

現在可以得到破解凱撒密碼的原理了,我們統計一片經過凱撒加密的密文字元信息,在出現頻率較高的字元裡面尋找差值是69的2個字元,這兩個必定是 ' ' 和 'e' 字元的加密字元,計算偏移量(既密鑰key),通過解密運算,還原出明文。

[破解演算法]

任何一片英文加密後的密文,我們統計出所有字元的個數:

[Copy to clipboard]
CODE:
#define MAX 128

... ...

FILE *fp_ciphertext;
char cipher_char;
int i; //密文文件長度,包含多少字元
unsigned int size_file=0; //申明num數組,存儲各個ASCII字元在密文中出現的個數
num[MAX];

... ...

for(i = 0;i < MAX; i++) //初始化num數組中的值
num[i] = 0;

... ...

while((cipher_char=fgetc(fp_ciphertext))!=EOF)
{
num[cipher_char]++;
size_file++;
}

統計出現最多次數的字元,定義#define GETTOP 10,統計最多的前10位字元:

[Copy to clipboard]
CODE:
//統計前10位
#define GETTOP 10

... ...

int temp,i,j;
int maxascii[GETNUM]; //申明maxascii數組,存儲統計出的概率前10位的字元ascii碼
int maxtimes[GETNUM]; //申明maxtimes數組,存儲統計出的概率前10位的字元的出現次數

... ...

for(i=0;i<GETTOP;i++)
{
temp=0; //臨時變數temp裡面來存儲出現最多次數的字元的ascii碼
for(j=1;j<MAX;j++) //依次比較所有的字元次數,獲得最多字元的ascii碼
{
if(num[j]>=num[temp])
temp=j;
}
maxascii[i]=temp; //把出現最多次數字元的ascii存儲到相應的maxascii數組中
maxtimes[i]=num[temp]; //把最多次數字元的出現次數存儲到相應的maxtimes數組中
num[temp]=0; //把最多次數字元的次數賦值成0,
//進行循環運算,同樣的演算法,第二次循環得到的值,肯定是出現第二多的字元
//避免了對256或128個字元進行排序的復雜運算
//當年我用匯編編寫成績排序的程序時,也用這套排序演算法:-)

}

找出出現最多字元中,ASCII碼差別是69的兩個字元,計算出密鑰key的長度:

[Copy to clipboard]
CODE:
for(i=0;i<GETTOP;i++)
{
for(j=0;j<GETTOP;j++)
{
if((max[i]-max[j])==69)
{
key=(max[j] - 32 + MAX ) % MAX;
printf("Key : %d\n",key);
break;
}
}
}

既然得到了密鑰長度,算完成了對凱撒密碼的破解了,那就進行解密吧,大功告成!

『陸』 jmu-python-凱撒密碼加密演算法,謝謝

def encryption():
str_raw = input("請輸入明文:")
k = int(input("請輸入位移值:"))
str_change = str_raw.lower()
str_list = list(str_change)
str_list_encry = str_list
i = 0
while i < len(str_list):
if ord(str_list[i]) < 123-k:
str_list_encry[i] = chr(ord(str_list[i]) + k)
else:

print ("解密結果為:"+"".join(str_list_decry))
while True:
print (u"1. 加密")
print(u"2. 解密")
choice = input("請選擇:")
if choice == "1": encryption()
elif choice == "2": decryption()
else: print (u"您的輸入有誤!")

『柒』 匯編語言寫個凱撒密碼加密和解密的!

著名的凱撒加密演算法就是一種簡單的替代加密法,它是將明文中每一個字元用右移3位並以26個字元為模的替代(A由D替代,B由E替代,··…—,W由Z替代,X由A替代,Y由B替代,Z由C替代)。

所以你的匯編很簡單呀,按1的時候,你用一個寄存器指向明文,然後對寄存器指向的數據做加3,然後mod26的處理,解密是按2的時候,你用一個寄存器指向密文,然後然後對寄存器指向的數據做減3,然後mod26的處理。

『捌』 C語言的凱撒密碼問題我想求教這個演算法是怎麼推出來的呢 加密演算法:(a[i]-a+k)%26-a

它的原理是字母與字母之間的替換。例如26個字母都向後移動K位。若K等於2,則A用C代替,B用D代替,以此類推
k是移動的位數,例如移動兩位,當前字母是c,那麼c-a=2,再加2,4%26=4(保證變換後的在26個字母的范圍內),然後a+4即為e

『玖』 將凱撒密碼X的加密、解密過程用C語言編程實現

1、在密碼學中,愷撒密碼(或稱愷撒加密、愷撒變換、變換加密)是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。這個加密方法是以愷撒的名字命名的,當年愷撒曾用此方法與其將軍們進行聯系。愷撒密碼通常被作為其他更復雜的加密方法中的一個步驟,例如維吉尼爾密碼。愷撒密碼還在現代的ROT13系統中被應用。但是和所有的利用字母表進行替換的加密技術一樣,愷撒密碼非常容易被破解,而且在實際應用中也無法保證通信安全。例子愷撒密碼的替換方法是通過排列明文和密文字母表,密文字母表示通過將明文字母表向左或向右移動一個固定數目的位置。

2、kaiser加密演算法具體程序:

#include<stdio.h>
#include<conio.h>
charencrypt(charch,intn)/*加密函數,把字元向右循環移位n*/
{
while(ch>='A'&&ch<='Z')
{
return('A'+(ch-'A'+n)%26);
}
while(ch>='a'&&ch<='z')
{
return('a'+(ch-'a'+n)%26);
}
returnch;
}
voidmenu()/*菜單,1.加密,2.解密,3.暴力破解,密碼只能是數字*/
{
clrscr();
printf(" =========================================================");
printf(" 1.Encryptthefile");
printf(" 2.Decryptthefile");
printf(" 3.Forcedecryptfile");
printf(" 4.Quit ");
printf("========================================================= ");
printf("Pleaseselectaitem:");
return;
}
main()
{
inti,n;
charch0,ch1;
FILE*in,*out;
charinfile[20],outfile[20];
textbackground(BLACK);
textcolor(LIGHTGREEN);
clrscr();
sleep(3);/*等待3秒*/
menu();
ch0=getch();
while(ch0!='4')
{
if(ch0=='1')
{
clrscr();
printf(" Pleaseinputtheinfile:");
scanf("%s",infile);/*輸入需要加密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile! ");
printf("Pressanykeytoexit! ");
getch();
exit(0);
}
printf("Pleaseinputthekey:");
scanf("%d",&n);/*輸入加密密碼*/
printf("Pleaseinputtheoutfile:");
scanf("%s",outfile);/*輸入加密後文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile! ");
printf("Pressanykeytoexit! ");
fclose(in);
getch();
exit(0);
}
while(!feof(in))/*加密*/
{
fputc(encrypt(fgetc(in),n),out);
}
printf(" Encryptisover! ");
fclose(in);
fclose(out);
sleep(1);
}
if(ch0=='2')
{
clrscr();
printf(" Pleaseinputtheinfile:");
scanf("%s",infile);/*輸入需要解密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile! ");
printf("Pressanykeytoexit! ");
getch();
exit(0);
}
printf("Pleaseinputthekey:");
scanf("%d",&n);/*輸入解密密碼(可以為加密時候的密碼)*/
n=26-n;
printf("Pleaseinputtheoutfile:");
scanf("%s",outfile);/*輸入解密後文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile! ");
printf("Pressanykeytoexit! ");
fclose(in);
getch();
exit(0);
}
while(!feof(in))
{
fputc(encrypt(fgetc(in),n),out);
}
printf(" Decryptisover! ");
fclose(in);
fclose(out);
sleep(1);
}
if(ch0=='3')
{
clrscr();
printf(" Pleaseinputtheinfile:");
scanf("%s",infile);/*輸入需要解密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile! ");
printf("Pressanykeytoexit! ");
getch();
exit(0);
}
printf("Pleaseinputtheoutfile:");
scanf("%s",outfile);/*輸入解密後文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile! ");
printf("Pressanykeytoexit! ");
fclose(in);
getch();
exit(0);
}
for(i=1;i<=25;i++)/*暴力破解過程,在察看信息正確後,可以按'Q'或者'q'退出*/
{
rewind(in);
rewind(out);
clrscr();
printf("========================================================== ");
printf("Theoutfileis: ");
printf("========================================================== ");
while(!feof(in))
{
ch1=encrypt(fgetc(in),26-i);
putch(ch1);
fputc(ch1,out);
}
printf(" ======================================================== ");
printf("Thecurrentkeyis:%d ",i);/*顯示當前破解所用密碼*/
printf("Press'Q'toquitandotherkeytocontinue...... ");
printf("========================================================== ");
ch1=getch();
if(ch1=='q'||ch1=='Q')/*按'Q'或者'q'時退出*/
{
clrscr();
printf(" GoodBye! ");
fclose(in);
fclose(out);
sleep(3);
exit(0);
}
}
printf(" Forcedecryptisover! ");
fclose(in);
fclose(out);
sleep(1);
}
menu();
ch0=getch();
}
clrscr();
printf(" GoodBye! ");
sleep(3);
}

『拾』 c語言凱撒密碼暴力破解

加上這個函數吧

voidforce_decode(void)
{
charbuf[100];
charbuf1[100];
intn,i;

gets(buf);
for(n=1;n<26;n++)
{
printf("usekey%d ",n);
for(i=0;buf[i];i++)
{
if(buf[i]>='A'&&buf[i]<='Z')
{
buf1[i]=(buf[i]-'A'-n+26)%26+'A';
}
elseif(buf[i]>='a'&&buf[i]<='z')
{
buf1[i]=(buf[i]-'a'-n+26)%26+'a';
}
}
buf1[i]=0;
printf("%s ",buf1);
}
}

其實 如果改成在main中輸入,然後把decode改成處理字元串,並獲取結果。在main出輸出。

那麼要求的暴力破解就可以直接用decode的代碼了。

熱點內容
酷我ftp 發布:2024-06-15 00:30:37 瀏覽:725
華為路由器搭建pptp伺服器 發布:2024-06-15 00:15:47 瀏覽:740
解壓拓展有哪些 發布:2024-06-15 00:00:12 瀏覽:315
edm源碼 發布:2024-06-15 00:00:11 瀏覽:485
模擬退火演算法流程圖 發布:2024-06-14 23:59:18 瀏覽:341
電腦上的開機密碼在哪裡改的 發布:2024-06-14 23:54:06 瀏覽:885
cf手游刷級腳本 發布:2024-06-14 23:26:40 瀏覽:923
android顏色識別 發布:2024-06-14 23:20:44 瀏覽:692
osg編譯max 發布:2024-06-14 23:11:00 瀏覽:938
15個鏡頭的腳本 發布:2024-06-14 22:38:08 瀏覽:510