Не могу понять ошибку в этом коде - PullRequest
1 голос
/ 31 мая 2011

Итак, я делаю одно из упражнений Принстона здесь: http://www.cs.princeton.edu/courses/archive/fall10/cos126/assignments/lfsr.html и я полностью протестировал класс LFSR с данными, которые были предоставлены, так что я уверен, что не ошибся там. Однако мой класс PhotoMagic выдает зашифрованную фотографию трубы, как показано ниже: Encrypted photo of the Pipe image

Это не так, как должно выглядеть. Любая идея о том, где мой код не так?

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);
}

}

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Вам нужно дополнить результат Integer.toBinaryString () при расчете newRed, newGreen и newBlue. Может не иметь длины 8.

2 голосов
/ 31 мая 2011

Скорее всего, проблема в этом блоке кода

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;
}

Обратите внимание, что ваш newPattern начинается как строка нулевой длины, а затем вы добавляете ноль текста для каждого из битовв bitPattern.Затем вы добавляете bitPattern обратно в newPattern и возвращаете результат.Это приводит к 100% неслучайному результату, который является версией с добавлением нуля того же самого bitPattern, который вы только что отправили.

Так что, если входное значение равно

0010101101

, выходное значение будет

00000000000010101101

Который (при отбрасывании ведущих нулей) является именно входом

0010101101

Поскольку здесь нет дополнительной сложности, он не портит способность ума при обнаружении края:довольно легко увидеть шаблон.

0 голосов
/ 18 марта 2016

Я модифицировал следующим образом.Это сработало.

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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...