⑴ 矩阵加密和解密
去看看矩阵的乘法运算,就清楚了。很简单的乘法运算
⑵ 求个矩阵加密算法的程序
晕,我原号登陆竟然没有回答框~~!!
是不是楼主对我 (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 ;
}
如下:是一个测试数据.
加密矩阵为:
14 8 29 30 10 2 14 13
11 8 23 25 6 1 10 8
12 8 26 27 7 3 11 9
7 5 15 15 3 1 5 4
9 6 19 21 7 1 10 9
10 6 21 22 7 2 10 9
8 6 17 18 3 1 6 4
7 6 15 19 5 1 9 7
解密矩阵为:
-2 5 -1 -2 -3 5 -2 -1
-1 5 2 -1 -1 -1 -4 -1
2 -1 2 0 1 -5 0 0
-1 -4 -3 2 1 4 3 1
-3 2 0 -2 2 3 0 -2
-1 1 0 0 -1 2 -1 0
2 4 4 -4 -1 -6 -2 -1
1 -3 -2 4 -1 1 0 2
被加密文件:
=====================================
发往: 刘晓辉 (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> ;;5;D 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
-------------------------------------
⑶ 矩阵在密码学的运用问题
对密码不熟,代数还可以,我的理解是这样的,首先要将“ALGEBRA”转换为向量c=(1 12 7 5 2 18 1 9 3)。
设A为一个可逆矩阵,与传递的信息大小要相同,这里就是9×9,
则可以c*A或者A*transpose(c)(transpose表示c的转置向量,*为乘法),得到一个行或者列向量。
把得出的行或者列向量作为加密后的信息发出,解密者若知道这一个矩阵A,
如果用的是行向量,则需右乘A的逆矩阵即可得到原来的向量c,再对应到字母A……Z,就为传递的信息;列向量的话就需要左乘矩阵A的逆矩阵。
⑷ 【Hill密码加密解密问题】 给定一个长度为n的明文,请问密钥矩阵的维数具体要怎么取
不一定
你可以取一个3维的可逆矩阵
但注意矩阵的行列式的值最好是1
这样可以保证逆矩阵不出现分数
⑸ 矩阵的实际应用都有哪些
1、矩阵在经济生活中的应用
矩阵就是在行列式的基础上演变而来的,可活用行列式求花费总和最少等类似的问题;可借用特征值和特征向量预测若干年后的污水水平等问题;也可利用矩阵的方法求线性规划问题中的最优解,求解企业生产哪一种类型的产品,获得的利润最大。
2、在人口流动问题方面的应用
这是矩阵高次幂的应用,比如预测未来的人口数量、人口的发展趋势等。
3、矩阵在密码学中的应用
可用可逆矩阵及其逆矩阵对需发送的秘密消息加密和译密。
4、矩阵在文献管理中的应用
在现代搜索中往往包括几百个文件和成千的关键词,但可以利用矩阵和向量的稀疏性,节省计算机的存储空间和搜索时间。
矩阵图法的用途十分广泛,在质量管理中,常用矩阵图法解决以下问题:
1、把系列产品的硬件功能和软件功能相对应,并要从中找出研制新产品或改进老产品的切入点;
2、明确应保证的产品质量特性及其与管理机构或保证部门的关系,使质量保证体制更可靠;
3、明确产品的质量特性与试验测定项目、试验测定仪器之间的关系,力求强化质量评价体制或使之提高效率;
4、当生产工序中存在多种不良现象,且它们具有若干个共同的原因时,希望搞清这些不良现象及其产生原因的相互关系,进而把这些不良现象一举消除。
⑹ 世界常用密码暗号是什么
一、RSA算法密码
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
二、ECC加密法密码
ECC算法也是一个能同时用于加密和数字签名的算法,也易于理解和操作。同RSA算法是一样是非对称密码算法使用其中一个加密,用另一个才能解密。
三、二方密码
二方密码(en:Two-square_cipher)比四方密码用更少的矩阵。
四、四方密码
四方密码用4个5×5的矩阵来加密。每个矩阵都有25个字母(通常会取消Q或将I,J视作同一样,或改进为6×6的矩阵,加入10个数字)。
五、三分密码
首先随意制造一个3个3×3的Polybius方格替代密码,包括26个英文字母和一个符号。然后写出要加密的讯息的三维坐标。讯息和坐标四个一列排起,再顺序取横行的数字,三个一组分开,将这三个数字当成坐标,找出对应的字母,便得到密文。
⑺ 关于棋盘密码(一种古典密码) 怎么解密,加密
棋盘密码的加密方法,其实方法十分简单,在密码学并不发达的古代,也够用了。棋盘密码的解题思路是这样
这种密码的原理是:通信双方各掌握一个m*n列的矩阵,比如A列第一行写上“我”,A列第2行写上“的”……以此类推,构成:
所以,“我的名字叫XXX”的密文即:A1A2A3A4B1B2。这样,一份密文就出来了。
使用这种密码表的加密也叫作 ADFGX 密码(密文中只有 A D F G X)
明文:HELLO 密文:DD XF AG AG DF
对于解密,对密文每两个字符一组,分别进行解密
由于密文仅包含5个字符,所以其密钥(也就是密码表)只有5!种可能
写脚本暴力攻击(brute-force)即可
棋盘密码的由来:
公元前2世纪前后希腊人提出了棋盘密码,在当时得到了广泛的运用。同时,它也是密码史上第一个密码。棋盘密码通过将26个字母设法变成十位数来达到加密的目的。棋盘密码的密钥是一个5×5的棋盘,将26个英文字母放置在里面。其中 i 和 j 共用一个密码。
⑻ 世界上各种密码的形式
1、二方密码:
二方密码(en:Two-square_cipher)比四方密码用更少的矩阵。
得出加密矩阵的方法和四方密码一样。
例如用“example”和“keyword”作密匙,加密lp。首先找出第一个字母(L)在上方矩阵的位置,再找出第二个字母(P)在下方矩阵的位置:
E X A M P
L B C D F
G H I J K
N O R S T
U V W Y Z
K E Y W O
R D A B C
F G H I J
L M N P S
T U V X Z
在上方矩阵找第一个字母同行,第二个字母同列的字母;在下方矩阵找第一个字母同列,第二个字母同行的字母,那两个字母就是加密的结果:
E X A M P
L B C D F
G H I J K
N O R S T
U V W Y Z
K E Y W O
R D A B C
F G H I J
L M N P S
T U V X Z
help me的加密结果:
he lp me
HE DL XW
这种加密法的弱点是若两个字同列,便采用原来的字母,例如he便加密作HE。约有二成的内容都因此而暴露。
2、四方密码
四方密码用4个5×5的矩阵来加密。每个矩阵都有25个字母(通常会取消Q或将I,J视作同一样,或改进为6×6的矩阵,加入10个数字)。
首先选择两个英文字作密匙,例如example和keyword。对于每一个密匙,将重复出现的字母去除,即example要转成exampl,然后将每个字母顺序放入矩阵,再将余下的字母顺序放入矩阵,便得出加密矩阵。
将这两个加密矩阵放在右上角和左下角,余下的两个角放a到z顺序的矩阵:
a b c d e E X A M P
f g h i j L B C D F
k l m n o G H I J K
p r s t u N O R S T
v w x y z U V W Y Z
K E Y WO a b c d e
R D A BC f g h i j
F G H I J k l m n o
L M N P S p r s t u
T U V X Z v w x y z
加密的步骤:
两个字母一组地分开讯息:(例如hello world变成he ll ow or ld)
找出第一个字母在左上角矩阵的位置
a b c d e E X A M P
f g h i j L B C D F
k l m n o G H I J K
p r s t u N O R S T
v w x y z U V W Y Z
K E Y W O a b c d e
R D A B C f g h i j
F G H I J k l m n o
L M N P S p r s t u
T U V X Z v w x y z
同样道理,找第二个字母在右下角矩阵的位置:
a b c d e E X A M P
f g h i j L B C D F
k l m n o G H I J K
p r s t u N O R S T
v w x y z U V W Y Z
K E Y W O a b c d e
R D A B C f g h i j
F G H I J k l m n o
L M N P S p r s t u
T U V X Z v w x y z
找右上角矩阵中,和第一个字母同行,第二个字母同列的字母:
a b c d e E X A M P
f g h i j L B C D F
k l m n o G H I J K
p r s t u NO R S T
v w x y z U V W Y Z
K E Y W O a b c d e
R D A B C f g h i j
F G H I J k l m n o
L M N P S p r s t u
T U V X Z v w x y z
找左下角矩阵中,和第一个字母同列,第二个字母同行的字母:
a b c d e E X A M P
f g h i j L B C D F
k l m n o G H I J K
p r s t u N O R S T
v w x y z U V W Y Z
K E Y W O a b c d e
R D A B C f g h i j
F G H I J k l m n o
L M N P S p r s t u
T U V X Z v w x y z
这两个字母就是加密过的讯息。
he lp me ob iw an ke no bi的加密结果:
FY GM KY HO BX MF KK KI MD
3、三分密码
首先随意制造一个3个3×3的Polybius方格替代密码,包括26个英文字母和一个符号。然后写出要加密的讯息的三维坐标。讯息和坐标四个一列排起,再顺序取横行的数字,三个一组分开,将这三个数字当成坐标,找出对应的字母,便得到密文。
(8)矩阵密码加密解密扩展阅读:
加密方法:
替换加密法:用一个字符替换另一个字符的加密方法。
换位加密法:重新排列明文中的字母位置的加密法。
回转轮加密法:一种多码加密法,它是用多个回转轮,每个回转轮实现单码加密。这些回转轮可以组合在一起,在每个字母加密后产生一种新的替换模式。
多码加密法:一种加密法,其替换形式是:可以用多个字母来替换明文中的一个字母。
夹带法:通过隐藏消息的存在来隐藏消息的方法。
⑼ 在c#中如何用矩阵在加密解密中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//矩阵数据结构
//二维矩阵
class _Matrix
{
public int m;
public int n;
public float[] arr;
//初始化
public _Matrix()
{
m = 0;
n = 0;
}
public _Matrix(int mm,int nn)
{
m = mm;
n = nn;
}
//设置m
public void set_mn(int mm,int nn)
{
m = mm;
n = nn;
}
//设置m
public void set_m(int mm)
{
m = mm;
}
//设置n
public void set_n(int nn)
{
n = nn;
}
//初始化
public void init_matrix()
{
arr = new float[m * n];
}
//释放
public void free_matrix()
{
//delete [] arr;
}
//读取i,j坐标的数据
//失败返回-31415,成功返回值
public float read(int i,int j)
{
if (i >= m || j >= n)
{
return -31415;
}
//return *(arr + i * n + j);
return arr[i * n + j];
}
//写入i,j坐标的数据
//失败返回-1,成功返回1
public int write(int i,int j,float val)
{
if (i >= m || j >= n)
{
return -1;
}
arr[i * n + j] = val;
return 1;
}
};
//二维运算类
class _Matrix_Calc
{
//初始化
public _Matrix_Calc()
{
}
//C = A + B
//成功返回1,失败返回-1
public int add(ref _Matrix A,ref _Matrix B,ref _Matrix C)
{
int i = 0;
int j = 0;
//判断是否可以运算
if (A.m != B.m || A.n != B.n ||
A.m != C.m || A.n != C.n)
{
return -1;
}
//运算
for (i = 0;i < C.m;i++)
{
for (j = 0;j < C.n;j++)
{
C.write(i,j,A.read(i,j) + B.read(i,j));
}
}
return 1;
}
//C = A - B
//成功返回1,失败返回-1
public int subtract(ref _Matrix A,ref _Matrix B, ref _Matrix C)
{
int i = 0;
int j = 0;
//判断是否可以运算
if (A.m != B.m || A.n != B.n ||
A.m != C.m || A.n != C.n)
{
return -1;
}
//运算
for (i = 0;i < C.m;i++)
{
for (j = 0;j < C.n;j++)
{
C.write(i,j,A.read(i,j) - B.read(i,j));
}
}
return 1;
}
//C = A * B
//成功返回1,失败返回-1
public int multiply(ref _Matrix A, ref _Matrix B, ref _Matrix C)
{
int i = 0;
int j = 0;
int k = 0;
float temp = 0;
//判断是否可以运算
if (A.m != C.m || B.n != C.n ||
A.n != B.m)
{
return -1;
}
//运算
for (i = 0;i < C.m;i++)
{
for (j = 0;j < C.n;j++)
{
temp = 0;
for (k = 0;k < A.n;k++)
{
temp += A.read(i,k) * B.read(k,j);
}
C.write(i,j,temp);
}
}
return 1;
}
//行列式的值,只能计算2 * 2,3 * 3
//失败返回-31415,成功返回值
public float det(ref _Matrix A)
{
float value = 0;
//判断是否可以运算
if (A.m != A.n || (A.m != 2 && A.m != 3))
{
return -31415;
}
//运算
if (A.m == 2)
{
value = A.read(0,0) * A.read(1,1) - A.read(0,1) * A.read(1,0);
}
else
{
value = A.read(0,0) * A.read(1,1) * A.read(2,2) +
A.read(0,1) * A.read(1,2) * A.read(2,0) +
A.read(0,2) * A.read(1,0) * A.read(2,1) -
A.read(0,0) * A.read(1,2) * A.read(2,1) -
A.read(0,1) * A.read(1,0) * A.read(2,2) -
A.read(0,2) * A.read(1,1) * A.read(2,0);
}
return value;
}
//求转置矩阵,B = AT
//成功返回1,失败返回-1
public int transpos(ref _Matrix A,ref _Matrix B)
{
int i = 0;
int j = 0;
//判断是否可以运算
if (A.m != B.n || A.n != B.m)
{
return -1;
}
//运算
for (i = 0;i < B.m;i++)
{
for (j = 0;j < B.n;j++)
{
B.write(i,j,A.read(j,i));
}
}
return 1;
}
//求逆矩阵,B = A^(-1)
//成功返回1,失败返回-1
public int inverse(ref _Matrix A, ref _Matrix B)
{
int i = 0;
int j = 0;
int k = 0;
_Matrix m = new _Matrix(A.m,2 * A.m);
float temp = 0;
float b = 0;
//判断是否可以运算
if (A.m != A.n || B.m != B.n || A.m != B.m)
{
return -1;
}
/*
//如果是2维或者3维求行列式判断是否可逆
if (A.m == 2 || A.m == 3)
{
if (det(A) == 0)
{
return -1;
}
}
*/
//增广矩阵m = A | B初始化
m.init_matrix();
for (i = 0;i < m.m;i++)
{
for (j = 0;j < m.n;j++)
{
if (j <= A.n - 1)
{
m.write(i,j,A.read(i,j));
}
else
{
if (i == j - A.n)
{
m.write(i,j,1);
}
else
{
m.write(i,j,0);
}
}
}
}
//高斯消元
//变换下三角
for (k = 0;k < m.m - 1;k++)
{
//如果坐标为k,k的数为0,则行变换
if (m.read(k,k) == 0)
{
for (i = k + 1;i < m.m;i++)
{
if (m.read(i,k) != 0)
{
break;
}
}
if (i >= m.m)
{
return -1;
}
else
{
//交换行
for (j = 0;j < m.n;j++)
{
temp = m.read(k,j);
m.write(k,j,m.read(k + 1,j));
m.write(k + 1,j,temp);
}
}
}
//消元
for (i = k + 1;i < m.m;i++)
{
//获得倍数
b = m.read(i,k) / m.read(k,k);
//行变换
for (j = 0;j < m.n;j++)
{
temp = m.read(i,j) - b * m.read(k,j);
m.write(i,j,temp);
}
}
}
//变换上三角
for (k = m.m - 1;k > 0;k--)
{
//如果坐标为k,k的数为0,则行变换
if (m.read(k,k) == 0)
{
for (i = k + 1;i < m.m;i++)
{
if (m.read(i,k) != 0)
{
break;
}
}
⑽ 希尔密码原理
希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。
中文名
希尔密码
外文名
Hill Cipher
原理
基本矩阵论
类别
替换密码
提出者
Lester S. Hill
快速
导航
产生原因
原理
安全性分析
例子
简介
希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。
每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。
注意用作加密的矩阵(即密匙)在必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。
产生原因
随着科技的日新月异和人们对信用卡、计算机的依赖性的加强,密码学显得愈来愈重要。密码学是一门关于加密和解密、密文和明文的学科。若将原本的符号代换成另一种符号,即可称之为广义的密码。狭义的密码主要是为了保密,是一种防止窃文者得知内容而设的另一种符号文字,也是一般人所熟知的密码。
使用信用卡、网络账号及密码、电子信箱、电子签名等都需要密码。为了方便记忆,许多人用生日、电话号码、门牌号码记做密码,但是这样安全性较差。
为了使密码更加复杂,更难解密,产生了许多不同形式的密码。密码的函数特性是明文对密码为一对一或一对多的关系,即明文是密码的函数。传统密码中有一种叫移位法,移位法基本型态是加法加密系统C=P+s(mod m)。一般来说,我们以1表示A,2表示B,……,25表示Y,26表示Z,以此类推。由于s=0时相当于未加密,而0≤s≤m-1(s≥m都可用0≤s≤m-1取代),因此,整个系统只有m-1种变化。换言之,只要试过m-1次,机密的信息就会泄漏出去。
由此看来,日常生活中的密码和传统的密码的可靠性较差,我们有必要寻求一种容易将字母的自然频度隐蔽或均匀化,从而有利于统计分析的安全可靠的加密方法。希尔密码能基本满足这一要求。
原理
希尔加密算法的基本思想是,将d个明文字母通过线性变换将它们转换为d个密文字母。解密只要作一次逆变换就可以了,密钥就是变换矩阵本身。[1]
希尔密码是多字母代换密码的一种。多字母代换密码可以利用矩阵变换方便地描述,有时又称为矩阵变换密码。令明文字母表为Z,若采用L个字母为单位进行代换,则多码代换是映射f:Z→Z。若映射是线性的,则f是线性变换,可以用Z上的L×L矩阵K表示。若是满秩的,则变换为一一映射,且存在有逆变换K。将L个字母的数字表示为Z上的L维矢量m,相应的密文矢量c,且mK=c,以K作为解密矩阵,可由c恢复出相应的明文c·K=m。
在军事通讯中,常将字符(信息)与数字对应(为方便起见,我们将字符和数字按原有的顺序对应,事实上这种对应规则是极易被破解的):
abcde…x y z
12345…242526
如信息“NOSLEEPPING”对应着一组编码14,15,19,12,5,5,16,16,9,14,7。但如果按这种方式直接传输出去,则很容易被敌方破译。于是必须采取加密措施,即用一个约定的加密矩阵K乘以原信号B,传输信号为C=KB(加密),收到信号的一方再将信号还原(破译)为B=KC。