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

c語言非對稱

發布時間: 2022-12-08 05:44:07

❶ 使用c語言實現對稱加密演算法、非對稱加密演算法、HASH演算法,誰來提供個思路阿

網路找找

有RSA演算法,MD5演算法,維尼格演算法

這些演算法都很好找啊,我空間裡面就有一篇RSA的

網路搜索

這些代碼本來就難懂,涉及到數學的東西也很多

據說IBM公司DES加密的源代碼公布了十幾年後才有人弄懂

❷ 誰會用C語言實現AES演算法,謝謝

1 AES加密、解密演算法原理和AVR實現

AES是分組密鑰,演算法輸入128位數據,密鑰長度也是128位。用Nr表示對一個數據分組加密的輪數(加密輪數與密鑰長度的關系如表1所列)。每一輪都需要一個與輸入分組具有相同長度的擴展密鑰Expandedkey(i)的參與。由於外部輸入的加密密鑰K長度有限,所以在演算法中要用一個密鑰擴展程序(Keyexpansion)把外部密鑰K擴展成更長的比特串,以生成各輪的加密和解密密鑰。

1.1圈變化
AES每一個圈變換由以下三個層組成:
非線性層——進行Subbyte變換;
線行混合層——進行ShiftRow和MixColumn運算;
密鑰加層——進行AddRoundKey運算。

① Subbyte變換是作用在狀態中每個位元組上的一種非線性位元組轉換,可以通過計算出來的S盒進行映射。
Schange:
ldi zh,$01;將指針指向S盒的首地址
mov zl,r2;將要查找的數據作為指針低地址
ldtemp,z+;取出這個對應的數據
mov r2,temp;交換數據完成查表
.
.
.
ret

② ShiftRow是一個位元組換位。它將狀態中的行按照不同的偏移量進行循環移位,而這個偏移量也是根據Nb的不同而選擇的[3]。
shiftrow:;這是一個位元組換位的子程序
mov temp,r3;因為是4×4
mov r3,r7; r2 r6 r10 r14 r2 r6 r10 r14
mov r7,r11; r3 r7 r11 r15---r7 r11 r15 r3
mov r11,r15; r4 r8 r12 r17 r12 r17 r4 r8
mov r15,temp; r5 r9 r13 r18 r18 r5 r9 r13
mov temp,r4
mov temp1,r8
mov r4,r12
mov r8,r17
mov r12,temp
mov r17,temp1
mov temp,r18
mov r18,r13
mov r13,r9
mov r9,r5
mov r5,temp
ret

③ 在MixColumn變換中,把狀態中的每一列看作GF(28)上的多項式a(x)與固定多項式c(x)相乘的結果。b(x)=c(x)*a(x)的系數這樣計算:*運算不是普通的乘法運算,而是特殊的運算,即
b(x)=c(x)·a(x)(mod x4+1)
對於這個運算
b0=02。a0+03。a1+a2+a3
令xtime(a0)=02。a0
其中,符號「。」表示模一個八次不可約多項式的同餘乘法[3]。
mov temp,a0;這是一個mixcolimn子程序
rcall xtime;調用xtime程序
mov a0,temp
mov temp,a1
rcall xtime
eor a0,a1
eor a0,temp
eor a0,a2
eor a0,a3;完成b(x)的計算
.
.
.
xtime:;這是一個子程序
ldi temp1,$1b
lsl temp
brcs next1;如果最高位是1,則轉移
next: ret;否則什麼也不變化
next1:eor temp,temp1
rjmp next

對於逆變化,其矩陣C要改變成相應的D,即b(x)=d(x)*a(x)。

④ 密鑰加層運算(addround)是將圈密鑰狀態中的對應位元組按位「異或」。

⑤ 根據線性變化的性質[1],解密運算是加密變化的逆變化。這里不再詳細敘述。

1.2輪變化

對不同的分組長度,其對應的輪變化次數是不同的,如表1所列。

1.3密鑰擴展
AES演算法利用外部輸入密鑰K(密鑰串的字數為Nk),通過密鑰的擴展程序得到共計4(Nr+1)字的擴展密鑰。它涉及如下三個模塊:

① 位置變換(rotword)——把一個4位元組的序列[A,B,C,D]變化成[B,C,D,A];

② S盒變換(subword)——對一個4位元組進行S盒代替;

③ 變換Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。這里的x是(02),如
Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……

擴展密鑰的生成:擴展密鑰的前Nk個字就是外部密鑰K;以後的字W[[i]]等於它前一個字W[[i-1]]與前第Nk個字W[[i-Nk]]的「異或」,即W[[i]]=W[[i-1]]�W[[i- Nk]]。但是若i為Nk的倍數,則W[i]=W[i-Nk]�Subword(Rotword(W[[i-1]]))�Rcon[i/Nk]。

程序執行的時候,主要調用以上幾個子程序,具體實現如下:
Keyexpansion:
rcall rotwoed
rcall subword
rcall Rcon
.
.
.

2 AES加密、解密演算法的優化

由以上演算法的流程中可以清楚地看到,整個演算法中程序耗時最多的就是圈變化部分,因此對於演算法的優化也就在此;而圈變化部分可以優化的也就是列變化。因為列變化是一個模乘同餘規則。由於AES加密和解密是不對稱的,如果不對其進行優化,會使演算法的解密速度遠遠大於加密的速度[1]。

① 加密運算。對列變換(Mixcolumn)可以通過調用xtime子程序進行優化。

另一種有效的優化方法就是離線構造一個表格,即列變化表格。這樣只要通過查表的方式就可以提高加密速度。

② 解密演算法的優化。由於解密的列變換的系數分別是09、0E、0B和0D。在AVR單片機上實現以上的乘法顯然是需要很多的時間,從而導致了解密的性能降低。

優化方法一:對列變化進行分解使倍乘次數降低。

仔細研究解密矩陣的系數,不難發現解密矩陣和加密矩陣有著一定的聯系,即解密矩陣等於加密矩陣和一個矩陣的相乘。通過這樣的聯系,就可以對演算法進行優化:

這樣一來,只用幾個簡單的「異或」就可以實現列變化,使倍乘的次數降低,提高解密的速度。
優化方法二:構造表格。

同加密構造方法一樣,可以構造四個表格T[ea]=e×a; T[9a]=9×a;T[9a]=9×a;T[ba]=b×a。這樣一來,也只需要進行查表和簡單的異或就可以完成解密的任務。雖然這種方法將增加額外的開銷,但是它卻是一種有效的方法。

3 AES加密與解密的實驗模擬

根據以上實驗步驟和優化方法得出表2、3所列實驗結果。

設主密鑰為:(128bit)。
加密明文:。
密文:。
解密密文:。
明文:。

總之,AES密碼是一個非對稱密碼體制,它的解密要比加密復雜和費時。解密優化演算法沒有增加存儲空間的基礎上,以列變化為基礎進行處理,程序比原始的要小,而且節約了時間。解密優化方法速度最快,效率最高,但要增加系統的存儲空間,因此它的程序也是最大的一個
流程圖省略 朋友參考吧

❸ 寫一個程序,判斷是不是自反,反自反,對稱,非對稱,反對稱和傳遞該

方法/步驟
首先,求出關系的關系矩陣,即布爾邏輯0、1矩陣。

例如,集合A={1,2,5,8,12,16} R是整除關系。
那麼我們寫成關系矩陣。

關系矩陣 M=
1 1 1 1 1 1
0 1 0 1 1 1
0 0 1 0 0 0
0 0 0 1 0 1
0 0 0 0 1 0
0 0 0 0 0 1

R={<1,1>,<1,2>,<1,5>,<1,8>,<1,12>,<1,16>,<2,2>,<2,8>,<2,12>,<2,16>,<5,5>,<8,8>,<8,16>,<12,12>,<16,16>}

這時,我們要判斷是否為自反關系,只需檢查關系矩陣
對角線上的元素是否全為1。
全為1則關系是自反關系;
不全為1(只要對角線上有1個0),則不是自反關系。

顯然,整除關系是自反的。

要判斷是否為反自反關系,同樣只需檢查關系矩陣上的元素是否全為0

值得注意的是,如果集合A非空,則空關系滿足反自反,不滿足自反關系。

但集合A為空集,則空關系滿足自反關系,也滿足反自反。

從中我們可以看出,關系有可能既是自反關系,又是反自反關系。

同樣,關系有可能不是自反關系,也不是反自反關系。

這一點值得注意。

接下來,我們來看如何判斷關系的對稱性。

只需檢查關系矩陣的主對角線兩側的元素,是否一一對應,保持一致即可。
顯然,整除關系不是對稱關系。

如何判斷關系是反對稱關系呢?

同樣檢查關系矩陣的主對角線兩側的元素,是否一一對應,保持互補(有1的地方,對角線另一側的位置的元素為0)即可。

顯然,整除關系是反對稱關系。

注意,對稱關系與反對稱關系是互斥的,兩者只能最多出現一種情況。
而不像自反與反自反可以同時滿足。

下面來看如何通過關系矩陣,判斷是否是傳遞關系。
傳遞關系,在關系矩陣不能一眼直接看出,但是同樣可以按照步驟來檢查。

方法是:
按從上到下,從左到右,逐一檢查某行(例如a行)非對角線上的1元素,
定位到該1元素所在列,所對應的關系矩陣行,
檢查該行所有的1元素(或只檢查非對角線上的1元素),
將這些1元素所在列的a行元素找出,判斷是否都為1

都為1則,是傳遞關系;
但只要出現1個0,則不是傳遞關系。

顯然,整除關系滿足傳遞性。

下面我們來看,如何判斷關系是完全關系。
只需檢查關系矩陣中的對角線兩側相應的元素,都有元素1即可。

顯然整除關系,不是完全關系

最後,我們來看如何判斷關系是循環關系。
顧名思義,循環關系,就是aRb,bRc,則cRa
也就是說,關系矩陣中,第i行的第j列是1,以及第j行的第k列也為1的話,
則第k行的第i列,元素也是1,即滿足「循環」性質。

顯然,整除關系不滿足循環。

❹ 用c語言設計一個程序判斷一個5×5矩陣是否為對稱矩陣。謝謝!!!

#include<stdio.h>
main()
{
int matrix[5][5],i,j;
printf("請輸入5*5矩陣:\n");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&matrix[i][j]);
for(i=0;i<5;i++)
{
for(j=0;j<i;j++)
{
if(matrix[i][j]!=matrix[j][i])break;
}
if(j<i)break;
}
if(i<5)printf("非對稱矩陣\n");
else printf("對稱矩陣\n");
}

❺ c語言題目 編寫一個函數 判定n的維數組a是否為對稱矩陣

#include <stdio.h>
#define n 3 /* 此處假設為3階矩陣*/
int is_ichenjuzhen (int N,int *p[n][n]) /*定義函數*/
{
int i,j;
int flag=1; /*定義標志位*/
for(i=0;i<N;i++)
for(j=0;j<i;j++)
if(p[i][j]!=p[j][i])
flag=0;
return flag;
}
main()
{
int x,y;
int juzhen [n][n];
printf("請輸入數組:\n");
for(x=0;x<n;x++)
for(y=0;y<n;y++)
scanf("%d",&juzhen[x][y]);
printf("您所輸入的數組為:\n");
for(x=0;x<n;x++)
for(y=0;y<n;y++)
{
printf("%8d",juzhen[x][y]);
if(y==n-1)
printf("\n");
}
if(is_ichenjuzhen (n,juzhen)) /*調用函數*/
printf("您所輸入的矩陣是對稱矩陣!\n");
else printf("您所輸入的矩陣不是對稱矩陣!\n");
}
/*註:由於本及程序中有中文,所以建議在VC或Win TC下運行。*/
/*本程序經本人調試成功後提交答案,望樓主給分。*/
我看看,有兩個警告,但不影響結果,我再試試消除警告。

❻ 如何用C語言求一般矩陣(非對稱矩陣)的特徵值和特徵向量

用C++或者VB編程很煩人的,matlab中命令:[a,b]=eig(A)就是求解矩陣A的特徵值和特徵值對應的向量,他們分別會構成一個由特徵值組成的對角矩陣b和一個由對應特徵值的特徵列向量組成的a矩陣。或者命令a=eig[A]就只有特徵值組成的對角矩陣a,別去想用C++和VB之類的,這些軟體用來求解矩陣和matlab相差太遠了。我之前也想過編程解決,人家一個命令就能解決的問題何不取巧呢?

❼ 如何用C語言求一般矩陣(非對稱矩陣)的特徵值和特徵向量

建議參考一下譚浩強的書