求个矩阵加密算法的程序

求个矩阵加密算法的程序,第1张

晕,我原号登陆竟然没有回答框~~!!

是不是楼主对我 (1西方不胜1) 做了限制? 那我也只能回答一部分...

把 生成满秩矩阵以及其逆矩阵 的代码贴上来....

#include "stdio.h"

#include "time.h"

#include "stdlib.h"

#define MAX 8 // 矩阵大小

#define PT 10 // 附矩阵 随机初始值的最大值

#define bianhuan 100 // 由对角线矩阵生成满秩矩阵所需的行变化次数

struct changs// 记录变化的过程, 以便逆过来求其逆矩阵

{

int temp1

int temp2

} change[bianhuan + 1 ]

int Matrix[MAX][MAX] // 满秩矩阵

int R_matrix[MAX][MAX] // 逆矩阵

// ***** 生成 满秩矩阵 并求出该满秩矩阵的逆矩阵 ****************************//

void creat()

{

int i , k

int flage = 0

for(i = 0 i <MAX i ++ ) // 生成主对角线矩阵

Matrix[i][i] = R_matrix[i][i] = 1

for(k = 0 k <bianhuan k ++ ) // 进行 行 随意变化生成满秩矩阵 , 并记录下变化过程

{

int x1 = change[k].temp1 = rand() % MAX

int x2 = rand() % MAX

while( x2 == x1 ) x2 = rand() % MAX

change[k].temp2 = x2

for(i = 0 i <MAX i ++ )

if( Matrix[x1][i] + Matrix[x2][i] >= 31 ) break // 控制矩阵中最大的数的范围在30内

if(i >= MAX )

{

for(i = 0 i <MAX i ++ )

Matrix[x1][i] += Matrix[x2][i]

}

else k-- ,flage ++

if(flage >2000 ) { k++ break }

}

for(k-- k >= 0 k -- ) // 行逆变换, 求出其逆矩阵

{

for( i = 0 i <MAX i ++ )

R_matrix[ change[k].temp1 ][i] -= R_matrix[ change[k].temp2 ][i]

}

return

}

int main()

{

int i , j

srand(time(0))

creat()

printf("加密矩阵为:\n")

for(i =0 i <MAX i ++ )

{

for(j =0 j <MAX j ++)

printf("%4d " , Matrix[i][j])

printf("\n")

}

printf("\n")

printf("解密矩阵为:\n")

for( i = 0 i <MAX i ++ )

{

for(j =0 j <MAX j ++ )

printf("%4d ",R_matrix[i][j])

printf("\n")

}

return 0

}

如下:是一个测试数据.

加密矩阵为:

148 29 30 102 14 13

118 23 2561 108

128 26 2773 119

75 15 153154

96 19 2171 109

106 21 2272 109

86 17 183164

76 15 195197

解密矩阵为:

-25 -1 -2 -35 -2 -1

-152 -1 -1 -1 -4 -1

2 -1201 -500

-1 -4 -321431

-320 -2230 -2

-1100 -12 -10

244 -4 -1 -6 -2 -1

1 -3 -24 -1102

被加密文件:

=====================================

发往: 刘晓辉 (ACM基地/QT002)

时间: 2007-06-11 星期一 18:58:40 (RSA)(封装)

(文件) player.swf

-------------------------------------

加密后文件:

x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE x xxxx \ \\\\ g gggg 7 7777 R RRRR W WWWW ? ???? E EEEE hh]hv

Q QJQ[ YYSYd 11.16 G鶪?GQ KKDKU 8858>5D B9#PIaBP2,@:K2=90F@S9E'#-%-'72B-60):5F0:"-)4"*&!/+7&-%$8-3>H3*!*25*/$.6=. %"+0"( %-4%#$%'?5>nJ6Q1'2V8,C8,6`>1I?4"**$+K2&7.&-P5(##<&1"%@(#/+(

J1X!"9%B%&A(I#'? 2"<6#?(,*14)@x+2\. 8g 7%-R &/W�???"

(ER2L]>'<JE+AS% #. 8"5?$7D*?)5�.

.5 ^A`E3QK3K2*CR7T9.I.-*@ .B0"7D?F2%5"4 16)9)/*,3hk

$)QT #'-Y^ 13 #GI ? %KN 8>K(3T&':0#?@!5'H"#&

3(#96+$=( #+*"/?/

` "I' Q?,? A?" E25?%%.:xS#.\=&2gE7# (R9 ?!*W<? ?(#E0V]K%IvS BJ9[A IS>AdH '. %6( ?51Q8 >D65U<-5%+>. 25.)D. x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E x xx x \ \\ \ g gg g 7 77 7 R RR R W WW W ? ?? ? E EE E P(Px P ==\ = E"Eg E %%7 % 66R 6 ::W : **? * --E -

解密后文件:

=====================================

发往: 刘晓辉 (ACM基地/QT002)

时间: 2007-06-11 星期一 18:58:40 (RSA)(封装)

(文件) player.swf

-------------------------------------

#include<stdio.h>

#include<reg51.h>

#define uchar unsigned char

uchar key

int i=0

char b[4]={'0','0','0','0'}//输入的密码放这里和初始的比较来判断是否密码正确

void keyscan() //扫描按键是否按下

{

uchar temp

P3=0xfe //扫描第一行

temp=P3

temp=temp&0xf0

if(temp!=0xf0) //判断按键是否按下

{

delayms(10)//去抖动

temp=P3

temp=temp&0xf0

if(temp!=0xf0)//确认按键按下

{

temp=P3

switch(temp)

{

case 0xee:key='0'break

case 0xde:key='1'break

case 0xbe:key='2'break

case 0x7e:key='3'break

}

while(temp!=0xf0) //判断按键是否松开

{

temp=P3

temp=temp&0xf0

}

b[i]=keyi++if(i==3)i=0

}

}

P3=0xfd //扫描第二行

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delayms(10)

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xed:key='4'break

case 0xdd:key='5'break

case 0xbd:key='6'break

case 0x7d:key='7'break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

b[i]=keyi++if(i==3)i=0

}

}

P3=0xfb //扫描第三行

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delayms(10)

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xeb:key='8' break

case 0xdb:key='9' break

case 0xbb:key='A'break

case 0x7b:key='B'break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

b[i]=keyi++if(i==3)i=0

}

}

P3=0xf7 //扫描第四行

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

delayms(10)

temp=P3

temp=temp&0xf0

if(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xe7:key='C'break

case 0xd7:key='D'break

case 0xb7:key='E'break

case 0x77:key='F'break

}

while(temp!=0xf0)

{

temp=P3

temp=temp&0xf0

}

b[i]=keyi++if(i==3)i=0

}

}

}

main()

{

char a[4]={'3','5','A','C'}//这个做初始密码

while(1)//无限循环,保证了b 0-3 四个数有值

{

keyscan()

if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])

{

//这里写密码正确程序要怎么处理

}

}

}

// playFair 加密 你参考下 ...

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#define x 50

char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25]

bool Visit[27]={false}

char English[27]="abcdefghijklmnopqrstuvwxyz"

void Input()

{

printf("请输入密钥:\t") scanf("%s",MiYao)

printf("请输入待加密密码:\t") scanf("%s",PassWord)

}

void Fun_5x5()

{

int count = 0,V =0

/*标记密钥内字符为: true*/

for(int i=0MiYao[i]!='\0'i++)

if(strchr(English,MiYao[i])!=NULL)

Visit[strchr(English,MiYao[i])-English] = true

/*执行密钥矩阵 *** 作 并标记已使用字符:true*/

for(int i=0i<5i++)

for(int j=0j<5j++)

{

if(count<strlen(MiYao))

Table[i][j] = MiYao[count++]

else

{

while(Visit[V] != false) V++

Table[i][j] = English[V]

Visit[V++] = true

}

}

puts("∞∞∞密钥矩阵为∞∞∞")

for(int i=0i<5i++)

{ for(int j=0j<5j++)

printf("%3c",Table[i][j])

puts("")

}

puts("∞∞∞∞∞∞∞∞∞∞∞")

}

int IsVisited(char ch)

{

return Visit[strchr(English,ch)-English] //false 未出现过

}

void TabletoMap()

{ int count=0

for(int i=0i<5i++)

for(int j=0j<5j++)

Map[count++]=Table[i][j]

Map[count]='\0'

}

void Judge()

{

int len = strlen(PassWord),i,j,k

memset(AddPass,0,sizeof(char))

/*一对对去字母,剩下单个字母,则不变化,直接放入加密串中.*/

if(len%2){

AddPass[len-1] = PassWord[len-1]

len -=1

}

/*一对中 密钥矩阵中 存在矩阵 eg.ab 先输出a同行顶点在输出b同行顶点*/

int row1,low1,row2,low2,a1,a2

for(i=0i<leni+=2)

{

char c1,c2

c1 = PassWord[i]

c2 = PassWord[i+1]

/*一对中 两字母相同 无变化*/

/*一对中 有字母不在密钥矩阵中 无变化*/

if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))

{ AddPass[i] = c1

AddPass[i+1]=c2

}else{

a1 = strchr(Map,c1)-Map

row1 = a1/5 low1 = a1%5

a2 = strchr(Map,c2)-Map

row2 = a2/5 low2 = a2%5

/*一对中 字符出现在同行或同列 简单swap字符*/

if(row1 == row2 || low1 == low2)

{

AddPass[i] = c2

AddPass[i+1] = c1

}else{

AddPass[i] = Table[row1][low2]

AddPass[i+1] = Table[row2][low1]

}

}

}AddPass[len+1]='\0'

puts("加密后字符串:")

puts(AddPass)

puts("原串是:")

puts(PassWord)

}

int main()

{

Input()

Fun_5x5()

TabletoMap()

Judge()

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11544762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存