加密:
例如,一个字符串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语言编写一个可以加密很长字符串的算法,谢谢!

解决方案 »

  1.   

    public class Test { public static String encode(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[] 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")));
    }}
      

  2.   

    encode 比较简单 decode 稍复杂点儿,等我有时间再优化一下。
      

  3.   


    高手就是高手!牛!没想到一个矩阵加密解密算法书上写得那么简单,编起来竟然这么麻烦
    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];
    ………………
    这得出的整数是做什么的?看不懂什么意思啊?麻烦能注释一下么
      

  4.   

    确实,encode比较简单,decode很复杂
    下面的代码简单了一点
    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("结果正确!");
    }
    }
      

  5.   

    运行结果:加密前: abcdefghijklmabcd
    efgh
    ijkl
    m
    加密后: aeimbfjcgkdhlabcd
    efgh
    ijkl
    m
    解密后: abcdefghijklm结果正确!