Java Can';我无法找出这段代码中的错误

Java Can';我无法找出这段代码中的错误,java,image,encryption,feedback,Java,Image,Encryption,Feedback,所以我在这里做一个普林斯顿的练习: 我已经用提供的数据对LFSR类进行了全面测试,所以我确信我并没有出错。但是,我的PhotoMagic类生成管道的加密照片,如下所示: 事实并非如此。知道我的代码哪里出错了吗 import java.awt.Color; public class PhotoMagic { private LFSR lfsr; public static void main(String args[]) { new PhotoMagic("src/pictu

所以我在这里做一个普林斯顿的练习: 我已经用提供的数据对LFSR类进行了全面测试,所以我确信我并没有出错。但是,我的PhotoMagic类生成管道的加密照片,如下所示:

事实并非如此。知道我的代码哪里出错了吗

import java.awt.Color;

public class PhotoMagic 
{
    private LFSR lfsr;

public static void main(String args[])
{
    new PhotoMagic("src/pictures/shield.png","01101000010100010000",16);

}

public PhotoMagic(String imageName,String binaryPassword,int tap)
{
    Picture pic = new Picture(imageName);
    lfsr = new LFSR(binaryPassword,tap);


    for (int x = 0; x < pic.width(); x++) 
    {
        for (int y = 0; y < pic.height(); y++) 
        {
            Color color = pic.get(x, y);
            int red = color.getRed();
            int blue = color.getBlue();
            int green = color.getGreen();
            int transparency = color.getTransparency();
            int alpha = color.getAlpha();

            int newRed = xor(Integer.toBinaryString(red),paddedBitPattern(lfsr.generate(8)));

            int newGreen = xor(Integer.toBinaryString(green),paddedBitPattern(lfsr.generate(8)));

            int newBlue = xor(Integer.toBinaryString(blue),paddedBitPattern(lfsr.generate(8)));

            Color newColor = new Color(newRed, newGreen, newBlue);
            pic.set(x, y, newColor);
        }
    }
    pic.show();
}

/**
 * Pads bit pattern to the left with 0s if it is not 8 bits long
 * @param bitPattern
 * @return 
 */
public String paddedBitPattern(int bitPattern)
{
    String tempBit = Integer.toBinaryString(bitPattern);
    String newPattern = "";
    for(int i = 1; i < 9-tempBit.length(); i++)
    {
        newPattern += "0";
    }
    newPattern += tempBit;
    return newPattern;
}

/**
 * Performs the bitwise XOR
 * @param colorComponent
 * @param generatedBit
 * @return 
 */
public int xor(String colorComponent, String generatedBit)
{
    String newColor = "";

    for(int i = 0; i < colorComponent.length(); i++)
    {
        if(colorComponent.charAt(i) != generatedBit.charAt(i))
        {
            newColor += 1;
        }
        else
        {
            newColor += 0;
        }
    }
    return Integer.valueOf(newColor,2);
}
导入java.awt.Color;
公共级摄影
{
私人LFSR;
公共静态void main(字符串参数[])
{
新的PhotoMagic(“src/pictures/shield.png”,“01101000010100010000”,16);
}
公共PhotoMagic(字符串imageName、字符串binaryPassword、int-tap)
{
Picture pic=新图片(imageName);
lfsr=新的lfsr(二进制密码,点击);
对于(int x=0;x

}

问题可能就在这段代码中

public String paddedBitPattern(int bitPattern)
{
    String tempBit = Integer.toBinaryString(bitPattern);
    String newPattern = "";
    for(int i = 1; i < 9-tempBit.length(); i++)
    {
        newPattern += "0";
    }
    newPattern += tempBit;
    return newPattern;
}
输出将是

00000000000010101101
其中(删除前导零时)正是输入

0010101101

由于没有增加复杂性,它不会打乱大脑的边缘检测能力:很容易看到模式。

问题可能在这段代码中

public String paddedBitPattern(int bitPattern)
{
    String tempBit = Integer.toBinaryString(bitPattern);
    String newPattern = "";
    for(int i = 1; i < 9-tempBit.length(); i++)
    {
        newPattern += "0";
    }
    newPattern += tempBit;
    return newPattern;
}
输出将是

00000000000010101101
其中(删除前导零时)正是输入

0010101101

由于没有增加复杂性,它不会扰乱大脑的边缘检测能力:很容易看到模式。

在计算newRed、newGreen和newBlue时,需要填充Integer.tobinarysting()的结果。它可能没有长度8。

在计算newRed、newGreen和newBlue时,需要填充Integer.tobinarysting()的结果。它可能没有长度8。

I修改如下。成功了

int newRed = xor(paddedBitPattern(red),paddedBitPattern(lfsr.generate(8)));    
int newGreen = xor(paddedBitPattern(green),paddedBitPattern(lfsr.generate(8)));
int newBlue = xor(paddedBitPattern(blue),paddedBitPattern(lfsr.generate(8)));

我修改如下。成功了

int newRed = xor(paddedBitPattern(red),paddedBitPattern(lfsr.generate(8)));    
int newGreen = xor(paddedBitPattern(green),paddedBitPattern(lfsr.generate(8)));
int newBlue = xor(paddedBitPattern(blue),paddedBitPattern(lfsr.generate(8)));

如果不清楚,很抱歉,但传递到该方法中的唯一参数是介于0-255之间(含0-255)的十进制数,如果它的长度小于8位,则它将是二进制等效值。所以二进制中的42是101010,但是该方法将填充它,使其看起来像00101010,这允许xor方法操作它。所以这个bug是另外一回事儿。@tomejuan,好吧,所以它应该只是一个位到字符串的转换器。但是,XOR实现不能混合超出其包含的单个位。这意味着,如果不移动位(通过旋转或其他方式),则返回的数据将保留键长度边界以外的值趋势。图片只需要这里和那里的一些边界就可以重新整理,所以你会得到一些看起来像管道的东西,标签是“这不是管道”。如果要将密钥扩展到8x8位,请在每次传递到
paddedBitPattern
后将密钥旋转一位。@此外,对于图像的异或加密,8位是非常糟糕的边界。之所以使用它,是因为它计算效率高,易于编程;但是,RGBA的边界有8位表示红色、绿色、蓝色和Alpha。所以,每一个比特只会改变颜色,与它旁边的像素无关。人类可以很容易地认出一棵树,即使它是蓝色的。颜色偏移不会降低图片的可识别性。如果不清楚,请抱歉,但传递到该方法的唯一参数是介于0-255之间的十进制数,如果长度小于8位,则仅为二进制等效值。所以二进制中的42是101010,但是该方法将填充它,使其看起来像00101010,这允许xor方法操作它。所以这个bug是另外一回事儿。@tomejuan,好吧,所以它应该只是一个位到字符串的转换器。但是,XOR实现不能混合超出其包含的单个位。这意味着,如果不移动位(通过旋转或其他方式),则返回的数据将保留键长度边界以外的值趋势。图片只需要这里和那里的一些边界就可以重新整理,所以你会得到一些看起来像管道的东西,标签是“这不是管道”。如果要将密钥扩展到8x8位,请在每次传递到
paddedBitPattern
后将密钥旋转一位。@此外,对于图像的异或加密,8位是非常糟糕的边界。之所以使用它,是因为它计算效率高,易于编程;但是,RGBA的边界有8位表示红色、绿色、蓝色和Alpha。所以,每一个比特只会改变颜色,与它旁边的像素无关。人类可以很容易地认出一棵树,即使是我