免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2014 | 回复: 0
打印 上一主题 下一主题

请教一个关于ByteArrayOutputStream问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-05 22:09 |只看该作者 |倒序浏览
如下代码,只需要看红色的部分即可。谢谢。其中baos为ByteArrayOutputStream
  /**
     * 解密8个字节
     *
     * @param in
     *                 密文字节数组
     * @param offset
     *                 从何处开始解密
     * @param len
     *                 密文的长度
     * @return
     *                 true表示解密成功
     */
    private boolean decrypt8Bytes(byte[] in , int offset, int len) {
        // 这里第一步就是判断后面还有没有数据,没有就返回,如果有,就执行 crypt ^ prePlain
        for(pos = 0; pos < 8; pos++) {
            if(contextStart + pos >= len)
                return true;
            prePlain[pos] ^= in[offset + crypt + pos];
        }
        
        // 好,这里执行到了 d(crypt ^ prePlain)

        prePlain = decipher(prePlain);
        if(prePlain == null)//想问这里什么情况下为null??

                return false;
        
        // 解密完成,最后一步好像没做?
        // 这里最后一步放到decrypt里面去做了,因为解密的步骤有点不太一样
        // 调整这些变量的值先
        contextStart += 8;
        crypt += 8;
        pos = 0;
        return true;
    }

decipher函数如下
   /**
     * 解密从offset开始的8字节密文
     *
     * @param in
     *                 密文字节数组
     * @param offset
     *                 密文开始位置
     * @return
     *                 明文
     */
    private byte[] decipher(byte[] in, int offset) {
        // 迭代次数,16次
        int loop = 0x10;
        // 得到密文和密钥的各个部分,注意java没有无符号类型,所以为了表示一个无符号的整数
        // 我们用了long,这个long的前32位是全0的,我们通过这种方式模拟无符号整数,后面用到的long也都是一样的
        // 而且为了保证前32位为0,需要和0xFFFFFFFF做一下位与
        long y = Util.getUnsignedInt(in, offset, 4);
        long z = Util.getUnsignedInt(in, offset + 4, 4);
        long a = Util.getUnsignedInt(key, 0, 4);
        long b = Util.getUnsignedInt(key, 4, 4);
        long c = Util.getUnsignedInt(key, 8, 4);
        long d = Util.getUnsignedInt(key, 12, 4);
        // 算法的一些控制变量,sum在这里也有数了,这个sum和迭代次数有关系
        // 因为delta是这么多,所以sum如果是这么多的话,迭代的时候减减减,减16次,最后
        // 得到0。反正这就是为了得到和加密时相反顺序的控制变量,这样才能解密呀~~
        long sum = 0xE3779B90;
        sum &= 0xFFFFFFFFL;
        long delta = 0x9E3779B9;
        delta &= 0xFFFFFFFFL;

        // 迭代开始了, @_@
        while(loop-- > 0) {
            z -= ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d);
            z &= 0xFFFFFFFFL;
            y -= ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b);
            y &= 0xFFFFFFFFL;
            sum -= delta;
            sum &= 0xFFFFFFFFL;
        }

        baos.reset();
        writeInt((int)y);
        writeInt((int)z);//这里写入了8个字节,baos.toByteArray()什么时候会返回null呢?感觉怎么着也会返回8个字节
        return baos.toByteArray();

    }

writeInt函数如下

  1.     /**
  2.      * 写入一个整型到输出流,高字节优先
  3.      *
  4.      * @param t
  5.      */
  6.     private void writeInt(int t) {
  7.         baos.write(t >>> 24);
  8.         baos.write(t >>> 16);
  9.         baos.write(t >>> 8);
  10.         baos.write(t);
  11.     }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP