加密:
例如,一个字符串abcdefghij
变成数组形式:
a b c d
e f g h
i j
最后有2个是空的,无论是否为空,不影响结果;
然后按列读取,转变成字符串aeibfjcgdh解密:
字符串aeibfjcgdh转成数组形式:
a b c d
e f g h
i j
再回到字符串abcdefghij按照上面的例子,如何用Java语言编写一个可以加密很长字符串的算法,谢谢!
例如,一个字符串abcdefghij
变成数组形式:
a b c d
e f g h
i j
最后有2个是空的,无论是否为空,不影响结果;
然后按列读取,转变成字符串aeibfjcgdh解密:
字符串aeibfjcgdh转成数组形式:
a b c d
e f g h
i j
再回到字符串abcdefghij按照上面的例子,如何用Java语言编写一个可以加密很长字符串的算法,谢谢!
解决方案 »
- 为什么输出顺序与输入顺序不同呢??详见内容
- 笔试题两道,关于"字符串按一行6个字符分割,但不能把一个单词分在两行"
- 如何点击一个菜单的选项的按钮。出项一个需要用户填写信息的窗口啊 ??可以示范吗?谢谢啊 ,首先要一个菜单的程序还要一个菜单项的按钮,再次弹出一个窗口啊 ?谢谢啊
- 刚毕业,想边工作边考证,考什么合适呢
- netbeans相对路径
- 大家帮忙看一下运行结果
- JDialog关闭后出现的问题,郁闷啊!!!!
- 一个图片问题,现场100分等待
- vj中如何连接sqlserver???(直连接不是jdbc-odbc)
- 请教高手一个Swing程序的修改方法.
- 几个实战+理论性的问题,请高手解惑
- 100分,比较两个list中的值,求两个时间段的算法
if (s == null) return null;
if (s.length() == 0) return s;
int n = (int)Math.ceil(Math.pow(s.length(), 0.5));
char[] m = s.toCharArray();
StringBuilder rs = new StringBuilder(m.length);
for (int c = 0; c < n; c++) {
for (int r = 0; r < n; r++) {
int i = r * n + c;
if (i < m.length) {
rs.append(m[i]);
}
}
}
return rs.toString();
} public static String decode(String s) {
if (s == null) return null;
if (s.length() == 0) return s;
int n = (int)Math.ceil(Math.pow(s.length(), 0.5));
char[] a = s.toCharArray();
int len = a.length;
StringBuilder rs = new StringBuilder(len);
int rn = n - (n * n - len) / n;
char[][] m = new char[rn][];
for (int i = 0, r = 0; i < len; i += n) {
m[r++] = new char[len - i < n ? len - i : n];
}
for (int c = 0, i = 0; c < n; c++) {
for (int r = 0; r < n; r++) {
if (r < m.length && c < m[r].length) {
m[r][c] = a[i++];
}
}
}
for (int i = 0; i < m.length; i++) {
rs.append(m[i]);
}
return rs.toString();
} public static void main(String[] args) {
System.out.println(encode("abcdefghij"));
System.out.println(decode(encode("abcdefghij")));
System.out.println(encode("matrix encode and decode test"));
System.out.println(decode(encode("matrix encode and decode test")));
}}
高手就是高手!牛!没想到一个矩阵加密解密算法书上写得那么简单,编起来竟然这么麻烦
int n = (int)Math.ceil(Math.pow(s.length(), 0.5));
int i = r * n + c;
int rn = n - (n * n - len) / n;
m[r++] = new char[len - i < n ? len - i : n];
………………
这得出的整数是做什么的?看不懂什么意思啊?麻烦能注释一下么
下面的代码简单了一点
row\col分别表示char数组的行数和列数
col列数可以自己调节(加密和解密方法中同时调节),row行数根据col列数自动赋值
decode()中如果char数组不是满数组,yushu表示最后一行的多余列数,否则为0。
public class Securite {
public String encode(String s){
StringBuffer temp=new StringBuffer();
char[] c=s.toCharArray();
int length=c.length,row,col=4;
if(length%col==0)
row=length/col;
else
row=length/col+1;
char[][] k1=new char[row][col];
for(int i=0,n=0;i<row && n<length;i++)
for(int j=0;j<col && n<length;j++,n++){
k1[i][j]=c[n];
}
for(int i=0;i<row ;i++)
for(int j=0;j<col;j++){
System.out.print(k1[i][j]);
if(j==col-1)
System.out.println();
}
for(int j=0,n=0;j<col && n<length;j++)
for(int i=0;i<row && n<length;i++){
if(k1[i][j]!='\0'){
temp.append(k1[i][j]);
n++;
}
}
return temp.toString();
}
public String decode(String s){
StringBuffer temp=new StringBuffer();
char[] c=s.toCharArray();
int length=c.length,row,col=4;
int yushu=length%col;
if(yushu==0)
row=length/col;
else
row=length/col+1;
char[][] k1=new char[row][col];
for(int j=0,n=0,m=0;j<col && n<length;j++,m++)
for(int i=0;i<row && n<length;i++){
if(yushu==0)
k1[i][j]=c[n++];
else
if(m<yushu)
k1[i][j]=c[n++];
else
if(i!=row-1)
k1[i][j]=c[n++];
}
for(int i=0;i<row ;i++)
for(int j=0;j<col;j++){
System.out.print(k1[i][j]);
if(j==col-1)
System.out.println();
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
if(k1[i][j]!='\0')
temp.append(k1[i][j]);
return temp.toString();
}
public static void main(String[] args){
Securite securite=new Securite();
String s1,s2,s3;
s1="abcdefghijklm";
System.out.println("加密前: "+s1);
System.out.println();
s2=securite.encode(s1);
System.out.println("加密后: "+s2);
System.out.println();
s3=securite.decode(s2);
System.out.println("解密后: "+s3);
System.out.println();
if(s1.equals(s3))
System.out.println("结果正确!");
}
}
efgh
ijkl
m
加密后: aeimbfjcgkdhlabcd
efgh
ijkl
m
解密后: abcdefghijklm结果正确!