Saturday
Oct 4,2008
原理:设有明文字串矩阵S,初始矩阵M,则加密过程为 M * S = N,其中N为密文矩阵。解密过程则为 (M-1) * N = S。
于是乎,只要找到一个n阶矩阵M(n X n),字串矩阵S可以取自某一段文本的ASCII码,把他写成符合于M做矩阵乘法的格式就是S(n X 1)。所以,假设S的明文字符个数为m个,于是只要做(m / n)次和M的矩阵乘法即可得到密文。当然,这里的m可能为奇数或者偶数,所以可能会余留一个字符。遂欲得到密文矩阵N的明文字串的话,只要把密文矩阵N与初始矩阵M的逆矩阵(M-1)做矩阵乘法即可,最终可以得到明文字串S。所以M即是SN之间的钥匙。得到的N的复杂度和M的阶数以及内容有关。作为钥匙,M不可以取定值,最好是通过有用户输入一段密码来生成初始矩阵M,解密的时候再次输入密码生成M,之后再计算(M-1)。
关于求逆矩阵和矩阵乘法的Code,参见前2篇post。
Tags:
development,
Matrix,
Programming
Saturday
Oct 4,2008
关键部分的代码:
假设a[N][M] * b[M][K] = c[N][K];
- for (i = 0; i < 2; i++)
- for (j = 0; j < 3; j++)
- for (z = 0; z < 2; z++)
- {
- c[i][z] = c[i][z] + a[i][j] * b[j][z];
- }
Tags:
development,
Matrix,
Programming
Thursday
Sep 18,2008
主机字节序和网络字节序的转换只要更改p[]的顺序即可。
- unsinged long int ipstring2long(const char *ipstr)
- {
- int ip[4];
- int matches;
- unsinged long int tmp;
- unsigned char *p = (unsigned char*)&tmp;
-
- matches = sscanf(ipstr, "%u.%u.%u.%u", &ip[0], &ip[1], &ip[2], &ip[3]);
- if ( matches != 4 )
- {
- return (unsigned long int) - 1;
- }
- else
- {
- p[3] = ip[0];
- p[2] = ip[1];
- p[1] = ip[2];
- p[0] = ip[3];
- return tmp;
- }
-
- }
Tags:
code,
development