是不是楼主对我 (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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)