導航:首頁 > 源碼編譯 > 演算法c代碼實現原理

演算法c代碼實現原理

發布時間:2024-03-30 11:23:18

A. 用c語言設計一個簡單地加密算,解密演算法,並說明其中的原理

恰巧這兩天剛看的一種思路,很簡單的加密解密演算法,我說一下吧。
演算法原理很簡單,假設你的原密碼是A,用A與數B按位異或後得到C,C就是加密後的密碼,用C再與數B按位異或後能得回A。即(A異或B)異或B=A。用C實現很簡單的。
這就相當於,你用原密碼A和特定數字B產生加密密碼C,別人拿到這個加密的密碼C,如果不知道特定的數字B,他是無法解密得到原密碼A的。
對於密碼是數字的情況可以用下面的代碼:
#include <stdio.h>
#define BIRTHDAY 19880314
int main()
{
long a, b;

scanf("%ld", &a);
printf("原密碼:%ld\n", a);
b = BIRTHDAY;
a ^= b;
printf("加密密碼:%ld\n", a);

a ^= b; printf("解密密碼:%ld\n", a);
return 0;
}
如果密碼是字元串的話,最簡單的加密演算法就是對每個字元重新映射,只要加密解密雙方共同遵守同一個映射規則就行啦。

B. RC4的原理

RC4演算法的原理很簡單,包括初始化演算法(KSA)和偽隨機子密碼生成演算法(PRGA)兩大部分。假設S-box的長度為256,密鑰長度為Len。先來看看演算法的初始化部分(用C代碼表示):
其中,參數1是一個256長度的char型數組,定義為: unsigned char sBox[256];
參數2是密鑰,其內容可以隨便定義:char key[256];
參數3是密鑰的長度,Len = strlen(key); /*初始化函數*/voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen){inti=0,j=0;chark[256]={0};unsignedchartmp=0;for(i=0;i<256;i++){s[i]=i;k[i]=key[i%Len];}for(i=0;i<256;i++){j=(j+s[i]+k[i])%256;tmp=s[i];s[i]=s[j];//交換s[i]和s[j]s[j]=tmp;}}在初始化的過程中,密鑰的主要功能是將S-box攪亂,i確保S-box的每個元素都得到處理,j保證S-box的攪亂是隨機的。而不同的S-box在經過偽隨機子密碼生成演算法的處理後可以得到不同的子密鑰序列,將S-box和明文進行xor運算,得到密文,解密過程也完全相同。
再來看看演算法的加密部分(用C代碼表示):
其中,參數1是上邊rc4_init函數中,被攪亂的S-box;
參數2是需要加密的數據data;
參數3是data的長度. /*加解密*/voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen){inti=0,j=0,t=0;unsignedlongk=0;unsignedchartmp;for(k=0;k<Len;k++){i=(i+1)%256;j=(j+s[i])%256;tmp=s[i];s[i]=s[j];//交換s[x]和s[y]s[j]=tmp;t=(s[i]+s[j])%256;Data[k]^=s[t];}}最後,在main函數中,調用順序如下: intmain(){unsignedchars[256]={0},s2[256]={0};//S-boxcharkey[256]={justfortest};charpData[512]=這是一個用來加密的數據Data;unsignedlonglen=strlen(pData);inti;printf(pData=%s ,pData);printf(key=%s,length=%d ,key,strlen(key));rc4_init(s,(unsignedchar*)key,strlen(key));//已經完成了初始化printf(完成對S[i]的初始化,如下: );for(i=0;i<256;i++){printf(%02X,s[i]);if(i&&(i+1)%16==0)putchar(' ');}printf( );for(i=0;i<256;i++)//用s2[i]暫時保留經過初始化的s[i],很重要的!!!{s2[i]=s[i];}printf(已經初始化,現在加密: );rc4_crypt(s,(unsignedchar*)pData,len);//加密printf(pData=%s ,pData);printf(已經加密,現在解密: );//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密鑰rc4_crypt(s2,(unsignedchar*)pData,len);//解密printf(pData=%s ,pData);return0;}因此最終的完整程序是: //程序開始#include<stdio.h>#include<string.h>typedefunsignedlongULONG;/*初始化函數*/voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen){inti=0,j=0;chark[256]={0};unsignedchartmp=0;for(i=0;i<256;i++){s[i]=i;k[i]=key[i%Len];}for(i=0;i<256;i++){j=(j+s[i]+k[i])%256;tmp=s[i];s[i]=s[j];//交換s[i]和s[j]s[j]=tmp;}}/*加解密*/voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen){inti=0,j=0,t=0;unsignedlongk=0;unsignedchartmp;for(k=0;k<Len;k++){i=(i+1)%256;j=(j+s[i])%256;tmp=s[i];s[i]=s[j];//交換s[x]和s[y]s[j]=tmp;t=(s[i]+s[j])%256;Data[k]^=s[t];}}intmain(){unsignedchars[256]={0},s2[256]={0};//S-boxcharkey[256]={justfortest};charpData[512]=這是一個用來加密的數據Data;unsignedlonglen=strlen(pData);inti;printf(pData=%s ,pData);printf(key=%s,length=%d ,key,strlen(key));rc4_init(s,(unsignedchar*)key,strlen(key));//已經完成了初始化printf(完成對S[i]的初始化,如下: );for(i=0;i<256;i++){printf(%02X,s[i]);if(i&&(i+1)%16==0)putchar(' ');}printf( );for(i=0;i<256;i++)//用s2[i]暫時保留經過初始化的s[i],很重要的!!!{s2[i]=s[i];}printf(已經初始化,現在加密: );rc4_crypt(s,(unsignedchar*)pData,len);//加密printf(pData=%s ,pData);printf(已經加密,現在解密: );//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密鑰rc4_crypt(s2,(unsignedchar*)pData,len);//解密printf(pData=%s ,pData);return0;}//程序完

C. C語言工作原理

作為一種編程語言,本身是談不上工作原理的,實際上C語言所有的語法,正是C語言編譯器的工作原理或者工作機制的具體實現。要細致的討論起來是不可能,但是作為C語言程序員,必須了解這個大致的流程。一個程序,從C語言源碼,到系統可執行的文件,一般經歷四個過程。
1、預處理階斷,這個階斷是文本處理階斷,有預處理器來完成,會將源碼中的帶"#"開頭的預處理命令進行相應的處理,在Linux上C語言的預處理器程序是cp命令。
2、編譯階斷,這個階斷是有C語言編譯階斷,在Linux上C語言的編譯器是cc命令,它將C語言源碼轉換成匯編指令。
3、匯編階斷,這個階斷是匯編編譯階斷,在Linux上C語言的匯編器是as命令,這個階斷會將匯編指令編譯成二進制機器碼。
4、鏈接階斷,這個階斷是會將匯編階斷生成的機器碼目標文件,裝載成一個系統可執行的文件,在Linux平台以ELF格式進行組裝,在Windows平台上以PE格式進行組裝。在Linux平台上的鏈接器命令為ld,在windows平台上的鏈接器命令為linker。

D. 凱撒密碼的演算法c語言的怎麼實現啊

凱撒密碼是一種非常古老的加密方法,相傳當年凱撒大地行軍打仗時為了保證自己的命令不被敵軍知道,就使用這種特殊的方法進行通信,以確保信息傳遞的安全。他的原理很簡單,說到底就是字母於字母之間的替換。下面讓我們看一個簡單的例子:「」用凱撒密碼法加密後字元串變為「edlgx」,它的原理是什麼呢?把「」中的每一個字母按字母表順序向後移3位,所得的結果就是剛才我們所看到的密文。

#include <stdio.h>
main()
{
char M[100];
char C[100];
int K=3,i;
printf("請輸入明文M(注意不要輸入空白串)\n");
gets(M);

for(i=0;M[i]!='\0';i++)
C[i]=(M[i]-'a'+K)%26+'a';
C[i]='\0';

printf("結果是:\n%s\n",C);
}

E. C語言的輸出演算法原理

語言的輸出輸入功能是使用操作系統提供的功能實現的。
雖然C語言的函數在不同的操作系統下用法完全一樣,比如printf/puts,但是在不同平台上的實現不一樣。

在Windows平台上,使用的是MS的Console API實現的。
printf的實現如下
1.使用C語言的變參的功能,分析輸入的參數,得到一個最終要輸出的字元串。
2.使用Console API把字元串輸出到Console上。

Console API的信息參見
http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

F. PCA闄嶇淮綆楁硶鈥斺斿師鐞嗕笌瀹炵幇

鏈哄櫒瀛︿範鍩虹綆楁硶python浠g爜瀹炵幇鍙鍙傝冿細machine_learning_algorithms銆

1銆佺畝浠

PCA錛圥rincipal Component Analysis錛夋槸涓縐嶅父鐢ㄧ殑鏁版嵁鍒嗘瀽鏂規硶銆侾CA閫氳繃綰挎у彉鎹㈠皢鍘熷嬫暟鎹鍙樻崲涓轟竴緇勫悇緇村害綰挎ф棤鍏崇殑琛ㄧず錛屽彲鐢ㄤ簬鎻愬彇鏁版嵁鐨勪富瑕佺壒寰佸垎閲忥紝甯哥敤浜庨珮緇存暟鎹鐨勯檷緇淬

4涓浜涘筆CA鐨勮ょ煡

PCA鏈璐ㄤ笂鏄灝嗘柟宸鏈澶х殑鏂瑰悜浣滀負涓昏佺壒寰侊紝騫朵笖鍦ㄥ悇涓姝d氦鏂瑰悜涓婂皢鏁版嵁鈥滅葷浉鍏斥濓紝涔熷氨鏄璁╁畠浠鍦ㄤ笉鍚屾d氦鏂瑰悜涓婃病鏈夌浉鍏蟲с

鍥犳わ紝PCA涔熷瓨鍦ㄤ竴浜涢檺鍒訛紝渚嬪傚畠鍙浠ュ緢濂界殑瑙i櫎綰挎х浉鍏籌紝浣嗘槸瀵逛簬楂橀樁鐩稿叧鎬у氨娌℃湁鍔炴硶浜嗭紝瀵逛簬瀛樺湪楂橀樁鐩稿叧鎬х殑鏁版嵁錛屽彲浠ヨ冭檻Kernel PCA錛岄氳繃Kernel鍑芥暟灝嗛潪綰挎х浉鍏寵漿涓虹嚎鎬х浉鍏熾鍙﹀栵紝PCA鍋囪炬暟鎹鍚勪富鐗瑰緛鏄鍒嗗竷鍦ㄦd氦鏂瑰悜涓婏紝濡傛灉鍦ㄩ潪姝d氦鏂瑰悜涓婂瓨鍦ㄥ嚑涓鏂瑰樊杈冨ぇ鐨勬柟鍚戱紝PCA鐨勬晥鏋滃氨澶ф墦鎶樻墸浜嗐

鏈鍚庨渶瑕佽存槑鐨勬槸錛孭CA鏄涓縐嶆棤鍙傛暟鎶鏈錛屼篃灝辨槸璇撮潰瀵瑰悓鏍風殑鏁版嵁錛屽傛灉涓嶈冭檻娓呮礂錛岃皝鏉ュ仛緇撴灉閮戒竴鏍鳳紝娌℃湁涓昏傚弬鏁扮殑浠嬪叆錛屾墍浠PCA渚誇簬閫氱敤瀹炵幇錛屼絾鏄鏈韜鏃犳硶涓鎬у寲鐨勪紭鍖栥

閱讀全文

與演算法c代碼實現原理相關的資料

熱點內容
蘋果安卓打車價格不一樣如何解決 瀏覽:316
鴻蒙系統怎麼換為安卓系統 瀏覽:850
pdf已加密如何轉為ppt 瀏覽:6
文件或文件夾怎樣命名 瀏覽:928
悅跑圈演算法 瀏覽:707
騎砍2霸主作戰命令 瀏覽:982
嵌入式常用演算法 瀏覽:550
csgo不輸入命令如何切換伺服器 瀏覽:5
安卓手機怎麼開啟分身微信 瀏覽:308
蘇格拉底的申辯pdf 瀏覽:82
php手冊怎麼下載 瀏覽:760
哪個app可以看全運會男籃直播 瀏覽:970
excel中圖片怎麼壓縮 瀏覽:194
電腦上java編譯器 瀏覽:562
中聯壓縮式垃圾車報價 瀏覽:780
我的世界hmcl啟動器如何開伺服器 瀏覽:129
安卓7如何開啟導航鍵 瀏覽:397
無法連接科雷伺服器怎麼解決飢荒 瀏覽:192
伺服器滅火用什麼滅火器 瀏覽:863
壓縮機噴出來的油 瀏覽:89