置换密码体制加密算法
原理:
把消息一行一行的写出,然后按列读取,但把列的次序打乱,列的次序就是密钥;
密钥: 4 3 1 2 5 6 7
明文: a t t a c k p
o s t p o n e
d u n t i l t
w o a m x y z
密文:ttnaaptmtsuoaodwcoixknlypetz首先输入一串明文,再把明文转成二维数组,经加密输出密文,我在把明文转成二维数组时就出现了问题,各位大大能不能给出完整的算法或改正我的代码的错误,谢谢import java.util.*;
public class ReplaceAlog
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String plaintext ; //明文
String key ; //密钥 char[][] plaintextArray ={}; //明文二维数组
char[] array; //明文一维数组
int m,n;
System.out.println("请输入明文:\n");
Scanner reader= new Scanner(System.in);
plaintext = reader.next();
array =plaintext.toCharArray();
System.out.println("请输入密钥(非空非零不等数字列!):");
Scanner readerKey= new Scanner(System.in);
key = readerKey.next();
n=key.length(); //明文数组的列数
int x = plaintext.length()%n; //确定是否要手动随机添加明文
m = plaintext.length()/n; //明文数组的行数
if(x==0)
{
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*m + j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
}
else
{
String append="" ; //补缺字符串
System.out.println("当前明文数组不能组成完整的"+m+"行"+n+"列"+"数组\n");
System.out.println("请随机输入"+(n-x)+"个连续小写字母:\n");
Scanner readAppend = new Scanner(System.in);
append = readAppend.next(); //得到用户输入的空缺字符串
plaintext = plaintext.concat(append);
array =plaintext.toCharArray();
for(int i=0;i<(m+1);i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*(m+1) +j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
} }}
原理:
把消息一行一行的写出,然后按列读取,但把列的次序打乱,列的次序就是密钥;
密钥: 4 3 1 2 5 6 7
明文: a t t a c k p
o s t p o n e
d u n t i l t
w o a m x y z
密文:ttnaaptmtsuoaodwcoixknlypetz首先输入一串明文,再把明文转成二维数组,经加密输出密文,我在把明文转成二维数组时就出现了问题,各位大大能不能给出完整的算法或改正我的代码的错误,谢谢import java.util.*;
public class ReplaceAlog
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String plaintext ; //明文
String key ; //密钥 char[][] plaintextArray ={}; //明文二维数组
char[] array; //明文一维数组
int m,n;
System.out.println("请输入明文:\n");
Scanner reader= new Scanner(System.in);
plaintext = reader.next();
array =plaintext.toCharArray();
System.out.println("请输入密钥(非空非零不等数字列!):");
Scanner readerKey= new Scanner(System.in);
key = readerKey.next();
n=key.length(); //明文数组的列数
int x = plaintext.length()%n; //确定是否要手动随机添加明文
m = plaintext.length()/n; //明文数组的行数
if(x==0)
{
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*m + j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
}
else
{
String append="" ; //补缺字符串
System.out.println("当前明文数组不能组成完整的"+m+"行"+n+"列"+"数组\n");
System.out.println("请随机输入"+(n-x)+"个连续小写字母:\n");
Scanner readAppend = new Scanner(System.in);
append = readAppend.next(); //得到用户输入的空缺字符串
plaintext = plaintext.concat(append);
array =plaintext.toCharArray();
for(int i=0;i<(m+1);i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*(m+1) +j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
} }}
解决方案 »
- smslib 读不到端口问题
- GridBagLayout布局管理器问题
- ssh中,js如何获取多选框的值并传入action,下面是我的代码,大家帮忙修改一下,并帮我写出action感激不尽
- java 正則多行模式匹配小問題
- 大家帮忙看看错在哪里了?? 谢谢了
- 数据库连接出现了超奇怪的问题!!!!
- 简单问题:请问如何加一个参数在一个static mathod里
- 为什末JAVA编译速度比较慢?
- 第一次接触java适不适合看《java编程思想》?
- java向文本文件中插入数据?
- 我向oracle的一个字段下,要插入数据,如果数据超过4000个字节该如何处理(java)
- java中如何判断其他进程是否运行
加上:plaintextArray = new char[m][n];
不过
Scanner 应该没有必要每次弄一个的吧
我觉得一个就够了
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at ReplaceAlog.main(ReplaceAlog.java:34)
看起来这部分没有什么大问题吧主要是没有为数组分配内存
加上:plaintextArray = new char[m][n];
=========
没看明白呀??
你在if(x==0)前面加上
plaintextArray = new char[m][n];
if(x==0)
{
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
plaintextArray[i][j]= array[i*n + j];
}
}
System.out.println("输出明文数组");
for(int i=0;i<m;i++)
{
for(int j=0;i<n;j++)
{
System.out.println(plaintextArray[i][j]+ "\t");
}
}
}
但还是出现了问题
->
j<n
谢谢
但是怎么样打印一个二维数组plaintextArray[i][j] 呢?
{
for(int j=0;j<n;j++)
{
System.out.print(plaintextArray[i][j]+ "\t");
}
System.out.println();
}
-----------------------------------IT者--IT开发者的网站
http://www.itzhe.cn