明文:长度小于50位; 密文:要限制在20-25位;

解决方案 »

  1.   

    des 明文为8的倍数不行呀,我测过。“ringobob”能否发点代码?谢谢了!!!!
      

  2.   

    用DES或者AES就可以了,Java都内置了支持
    //生成一个key,只应该生成一次。
    SecretKey key = KeyGenerator.getInstance("DES").generateKey();
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] src = ...;
    //注意,encrypt不能直接new String,
    //如需要变成可见字符可用new sun.misc.BASE64Encoder().encode(encrypt)
    byte[] encrypt = cipher.doFinal(src);//这里是保存key的方法,应该通过保存keyCode来使用同一个key
    byte[] keyCode = key.getEncoded();
    key = new SecretKeySpec(keyCode, "DES");

    cipher.init(Cipher.DECRYPT_MODE, key);
    src = cipher.doFinal(encrypt);
      

  3.   

    byte[] src = "ringobob".getBytes();
    System.out.println(new String(src));
    这样也不会错的
    同样可以得到 "ringobob"
      

  4.   

    "ChDw"     能否把代码发给我, 还有“密钥和明文分别给多少位”,明文和密文就一样长了?谢谢你!!!!
      

  5.   

    这个项目非常急,"ChDw",我还在没时间研究。完了后,我向您请教!!!
      

  6.   

    上面的代码就已经足够了吧,生成密钥、加密、保存密钥、还原密钥、解密都有啊
    密文其实会比明文长一点点,DES是8位分组的。也就是如果数据不足8位补足8位,刚才8位就再补8位即50位明文加密后会被成56位,如果是56位会变成64位
      

  7.   

    如果一定要等长,我就只会简单的移位和交换了移位就是每若干个字节为一组,通过固定算法交换相互之间的位置
    交换就是定义一个加密数组和相应的解密数组,然后遍历原始数组的每一个字节,然后用加密数组中相应位置的字节替换,解密时相反,即
    byte[] b = {...} //其实就是由-128~127这256个字节的打乱顺序生成for(int i = 0; i < src.length; i++)
      src[i] = b[src[i]];
      

  8.   

    ChDw,能否给你现成的,大虾们不要骂我,我很好学,可不过我的项目急!!!!!
      

  9.   

    这个其实不复杂,简单的数组操作罢了。不过其实一般对长度没有这么严格要求吧,连长一点点都不能接受吗?DES、AES的安全性要高一些的 byte[] encryptArray = new byte[256];
    byte[] decryptArray = new byte[256];
    for(int i = 0; i < encryptArray.length; i++)
    encryptArray[i] = (byte) i;
    Random r = new Random();
            for (int i = encryptArray.length; i > 1; i--) {
             int index = r.nextInt(i);
             byte t = encryptArray[i - 1];
             encryptArray[i - 1] = encryptArray[index];
             encryptArray[index] = t;
             decryptArray[encryptArray[i - 1] & 0xFF] = (byte) (i - 1);
            }
            byte[] src = "abc27".getBytes();
            byte[] encrypt = new byte[src.length];
            for(int i = 0; i < src.length; i++)
             encrypt[i] = encryptArray[src[i] & 0xFF];
            
            //2位之间交换,加密
            for(int i = 1; i < encrypt.length; i += 2) {
             byte t = encrypt[i];
             encrypt[i] = encrypt[i - 1];
             encrypt[i - 1] = t;
            }
            //        //2位之间交换,解密
            for(int i = 1; i < encrypt.length; i += 2) {
             byte t = encrypt[i];
             encrypt[i] = encrypt[i - 1];
             encrypt[i - 1] = t;
            }
            //
            
            for(int i = 0; i < encrypt.length; i++)
             src[i] = decryptArray[encrypt[i] & 0xFF];
            System.out.println(new String(src));
      

  10.   

    ChDw,上面的代码的密文能不能只是“数字和字母”?
      

  11.   

    那就自己改啦,什么我都帮你做好。你是不是给我发钱其实就是上面那个数组只初始化26 + 26 + 10,
    然后在现在的循环中下标修正一下就行了,例如
    encrypt[i] = encryptArray[src[i] & 0xFF];
    改成
    if(src[i] >= 'A' && src[i] <= 'Z')
     encrypt[i] = encryptArray[src[i] - 'A'];
    else if(src[i] >= 'a' && src[i] <= 'z')
     encrypt[i] = encryptArray[src[i] - 'a' + 26];
    else if(src[i] >= '0' && src[i] <= '9')
     encrypt[i] = encryptArray[src[i] - '0' + 26 + 26];
    类似于这样
      

  12.   

    ChDw,我的项目主要是“长途车站”用,所以最好是密文是“数字和字母”
      

  13.   

    DES、AES 是对称加密算法中的块加密,原文或者填充后的原文必须得是 8 的整数位若想跟原文长度一样的话,只能使用对称加密算法中的流加密,在 JAVA 中有 RC4 的实现。
      

  14.   

    火龙哥果然diao      佩服,追赶
      

  15.   

    ChDw哥,#28你说的调了一下,密文只能是数字。如果加上字符的话,就解不了密。请您帮忙再调查一下!谢谢您!!!!