某应用软件对用户密码的加密算法很简单,描述如下:假设用户名为abc,密码为123456.其加密过程如下:第一步:先用用户名轮循的方式使之与密码等长,如上例中密码为6位,则补齐后的用户位为abcabc
第二步:将abcabc和123456各自转换为ASCII码(以十六进制表示)相加(将两字符串对应位置的字母asc码相加,各位置互相不影响).
以上面为例.
abcabc各位的ASCII码为:61 62 63 61 62 63
123456各位的ASCII码为:31 32 33 34 35 36
则二者相加的结果为: 92 94 96 95 97 99
所得到的密码字符串即为929496959799
同理,若密码为mjyHujik,则补齐的用户位为abcabcab
得到的密码为:
   61 62 63 61 62 63 61 62
  +6D 6A 79 48 75 6A 69 6B
________________________________
  =CE CC DC A9 D7 CD CA CD所得到的密码字符串为CECCDCA9D7CDCACD现在已经知道用户名和加密后的密码,需要求初始密码,请给出反求初始密码的算法,要求使用java语言实现

解决方案 »

  1.   

    import java.io.*;public class Example13 {
        public static String byteHEX(byte ib) {
            char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                           'A', 'B', 'C', 'D', 'E', 'F'};
            char[] ob = new char[2];
            ob[0] = Digit[(ib >>> 4) & 0X0F];
            ob[1] = Digit[ib & 0X0F];
            String s = new String(ob);
            return s;
        }    public static int hextoalgorism(String hex) {
            if (hex == null || hex.length() != 2) {
                return 0;
            }
            char[] h = new char[2];
            h = hex.toCharArray();
            int alg = 0;        alg = Char16ToInt(h[0]) * 16;
            alg += Char16ToInt(h[1]);
            return alg;
        }    public static int Char16ToInt(char c) {
            int rt = 0;
            switch (c) {
            case '0':
                rt = 0;
                break;
            case '1':
                rt = 1;
                break;
            case '2':
                rt = 2;
                break;
            case '3':
                rt = 3;
                break;
            case '4':
                rt = 4;
                break;
            case '5':
                rt = 5;
                break;
            case '6':
                rt = 6;
                break;
            case '7':
                rt = 7;
                break;
            case '8':
                rt = 8;
                break;
            case '9':
                rt = 9;
                break;
            case 'A':
                rt = 10;
                break;
            case 'B':
                rt = 11;
                break;
            case 'C':
                rt = 12;
                break;
            case 'D':
                rt = 13;
                break;
            case 'E':
                rt = 14;
                break;
            case 'F':
                rt = 15;
                break;
            }
            return rt;
        }    public static void main(String[] args) throws IOException {        String username = "abcabcab";
            byte[] p = new byte[username.length()];
            p = username.getBytes();
            String[] hexstr = new String[username.length()];
            String newpw = "CECCDCA9D7CDCACD";
            String[] pw = new String[newpw.length() / 2];
            int[] oldpw = new int[newpw.length() / 2];
            char pp;
            for (int i = 0; i < p.length; i++) {
                hexstr[i] = byteHEX(p[i]);
                System.out.print(hexstr[i]);
            }
            System.out.println();
            for (int n = 0; n < newpw.length() / 2; n++) {
                pw[n] = newpw.substring(n * 2, n * 2 + 2);
                System.out.print(pw[n]);
            }        System.out.println();
            System.out.println("------");
            for (int x = 0; x < oldpw.length; x++) {
                oldpw[x] = hextoalgorism(pw[x]) - hextoalgorism(hexstr[x]);
                pp = (char) oldpw[x];
                System.out.print(pp);
            }    }
    }
      

  2.   

    ob[0] = Digit[(ib >>> 4) & 0X0F];
            ob[1] = Digit[ib & 0X0F];
    能不能解释一下!
    比较抽象。
      

  3.   

    (ib >>> 4) & 0X0F 是变成 一个整数而且是一个正整数