作者jerry771210 (嘿嘿嘿)
看板NTUE-CS101
标题Re: [课业] 密码学作业
时间Tue Mar 29 10:51:12 2011
※ 引述《lobaka (爱撒娇的猫)》之铭言:
: #include<iostream>
: #include<fstream>
: using namespace std;
: char cipher(char key,char original)//转换函式 参数key,明文字元
: {
: char transfer; //输出用
: int numkey; //暂存由ASCII转换後的数字
直接比对他都会帮你很nice的转好
: numkey = key - 97; //小写a的ASCII码是97
: if(original + numkey < 122) //这边很重要!!由於ASCII码只定义到127
: { //若是超过的不会被当作ASCII处理的样子
: //确切原因博元不知道
: //不过大家可以试试看先把他加到超过127
: //在减回来,应该是转不回来
: transfer = original + numkey;//密文=原文+key的ASCII码-97
: //不懂为啥的去翻课本
: }
: else
: {
: transfer = original - 26 + numkey; //如果加到超过z则-26回头
: }
: return transfer; //回传密文
: }
我的加密是这样写...
cryp[] 原文 , temp[] 输入的key+原文(和原文等长)
for(int j=0 ; j<cryp.length() ; j++)
{
int add = int(cryp[j]-97) + temp[j]-97; //a=0,...,z=25
cryp[j] = add % 26 + 97; //转成英文
}
这时候的回传cryp[] , 就是加密完成的
然後丢进二维阵列的方式有很多
甚至你可以不要丢,用个 index 跑来跑去也可以
1.跑7 * row //row是总密文字数/7 (要判断啥时要加1喔 %7 > 0时)
2.一个一个丢进去 从[0][0]开始,丢到完这样
输出部分,要根据你输入的key2 ,7位数字顺序一行一行输出
for(int i=0;i<7;i++)
{
int var = key2[i]-1; //key2: 7位数字 (1~7不重复)
for(int j=0;j<row;j++) //text[7][row]是刚丢完的2维阵列
{
if(text[var][j] < 97 || text[var][j] > 122)
//如果不是英文,遇到空白或是结束
break;
else
{
cout<<text[var][j]; //输出爽的
fout<<text[var][j]; //丢到档案
}
}
}
--END--
--
※ 编辑: jerry771210 来自: 140.112.25.183 (03/29 10:59)