如题所述
第1个回答 2014-04-12
import java.*;
public class Practise {
public static void main(String[] args) {
int i=0,j=0;
char alphabetVeginere[][]=new char[26][26];//存储维吉利亚方表的二维数组
char alphabetCaesar[]=new char[26];
String P=new String();//明文
String K=new String();//密钥
String C=new String();//密文
//生成维吉利亚方表
for(i=0;i<26;i++)
{
for(j=0;j<26;j++)
{
alphabetVeginere[i][j]=(char)((i+j)%26+65);//字母A在ASCII表中的值是065
}
}
//生成凯撒字母表
for(i=0;i<26;i++)
{
alphabetCaesar[i]=(char)(i+65);
}
//K="butterfly";
K="P";
C="QTCGTCRPXCXPDNXOWX";//凯撒密文
//C="CAMSCPDBHOFDTDKYIK";
//C="AZRABIOBEHNYENIIINCA";
//C="CYGKIEHLGOCTHCZESG";//维吉利亚密文
System.out.println(CaesarEncrypt(K,C,alphabetCaesar));
//System.out.println(ViginereEncrypt(K,C,alphabetVeginere));
}
//凯撒解密
private static String CaesarEncrypt(String K,String C,char []alphabet)
{
String P=new String();
int i=0,j=0,n=0;//n是间隔
n=String.valueOf(alphabet).indexOf(K);
for(i=0;i<C.length();i++)
{
j=String.valueOf(alphabet).indexOf(C.charAt(i));
j=(j-n+26)%26;//向左移动n位
P+=(char)(j+65);
}
P=P.toLowerCase();
return P;
}
//维吉利亚解密
private static String ViginereEncrypt(String K,String C,char [][]alphabet)
{
String P=new String();
int i=0,x=0,y=0;//x是行数,y是列数
for(i=0;i<C.length();i++)
{
x=(int)K.toUpperCase().charAt(i%K.length())-65;//计算密钥每个字母所对应的行数
y=String.valueOf(alphabet[x]).indexOf(C.charAt(i));//计算密文每个字母所对应的列数
P+=(char)(y+65);
}
P=P.toLowerCase();
return P;
}
}
1、"QTCGTCRPXCXPDNXOWX";//凯撒加密密文
2、"CAMSCPDBHOFDTDKYIK";
3、"AZRABIOBEHNYENIIINCA";
4、"CYGKIEHLGOCTHCZESG";//维吉利亚加密密文
以上皆能解码出benrencainiaoyizhi,本人菜鸟一只追问
public class Practise {
public static void main(String[] args) {
int i=0,j=0;
char alphabetVeginere[][]=new char[26][26];//存储维吉利亚方表的二维数组
char alphabetCaesar[]=new char[26];
String P=new String();//明文
String K=new String();//密钥
String C=new String();//密文
//生成维吉利亚方表
for(i=0;i<26;i++)
{
for(j=0;j<26;j++)
{
alphabetVeginere[i][j]=(char)((i+j)%26+65);//字母A在ASCII表中的值是065
}
}
//生成凯撒字母表
for(i=0;i<26;i++)
{
alphabetCaesar[i]=(char)(i+65);
}
//K="butterfly";
K="P";
C="QTCGTCRPXCXPDNXOWX";//凯撒密文
//C="CAMSCPDBHOFDTDKYIK";
//C="AZRABIOBEHNYENIIINCA";
//C="CYGKIEHLGOCTHCZESG";//维吉利亚密文
System.out.println(CaesarEncrypt(K,C,alphabetCaesar));
//System.out.println(ViginereEncrypt(K,C,alphabetVeginere));
}
//凯撒解密
private static String CaesarEncrypt(String K,String C,char []alphabet)
{
String P=new String();
int i=0,j=0,n=0;//n是间隔
n=String.valueOf(alphabet).indexOf(K);
for(i=0;i<C.length();i++)
{
j=String.valueOf(alphabet).indexOf(C.charAt(i));
j=(j-n+26)%26;//向左移动n位
P+=(char)(j+65);
}
P=P.toLowerCase();
return P;
}
//维吉利亚解密
private static String ViginereEncrypt(String K,String C,char [][]alphabet)
{
String P=new String();
int i=0,x=0,y=0;//x是行数,y是列数
for(i=0;i<C.length();i++)
{
x=(int)K.toUpperCase().charAt(i%K.length())-65;//计算密钥每个字母所对应的行数
y=String.valueOf(alphabet[x]).indexOf(C.charAt(i));//计算密文每个字母所对应的列数
P+=(char)(y+65);
}
P=P.toLowerCase();
return P;
}
}
1、"QTCGTCRPXCXPDNXOWX";//凯撒加密密文
2、"CAMSCPDBHOFDTDKYIK";
3、"AZRABIOBEHNYENIIINCA";
4、"CYGKIEHLGOCTHCZESG";//维吉利亚加密密文
以上皆能解码出benrencainiaoyizhi,本人菜鸟一只追问
2、3分别是什么呢方式呢,解密需要将程序读取就行了么
追答我不懂密码学,昨天都是上网搜的资料然后弄的程序
第2个"CAMSCPDBHOFDTDKYIK",没有密钥,手推是普莱费尔playfair(网上搜普莱塞尔怎么也搜不到,我晕,这什么题目),已经知道怎么做了,程序今天才弄
第3个应该就是表格转置式,但是网上搜不到呀,你能跟我说说原理是啥么??不知道原理,写不出程序
我就是这题的答案,菜鸟一只,不懂啊,需要写程序的么?
追答我还以为你要的是程序啊,手写也是可以的啊,我都是上网搜的资料,昨天第一次接触,现在四题都懂了,你肯定也可以的,我先手工推,才再写程序的
追问帮忙手写一个标准点的答案被,一大波人等着咧,昨天看了看,完全不懂啊
追答我上网找了一个表格转置式的,有一点小错,但是思路方向是对的,答案也是对的
其他的网上都有啊,那些字母密码表怎么手写啊,晕,那个维吉利亚方表写到手抽筋啊,网上都有这个表的,你查一下就好了,很容易的,就是那个普莱费尔复杂一点,但是这个题已经没有密钥了,哎,如果有语音就好了,我直接说你就明白了
以后你选分类,像这样的不是要程序的,别分到这里了,不然大伙儿都以为是要程序,给你的也是程序