自定义密码加密/解密流

时间:2016-06-25 15:53:55

标签: java encryption cryptography

这是我的第一个问题,所以如果你有任何我可以改进的东西(帖子和编码风格),我很高兴知道。

我知道我的编码非常有效,所以我很乐意接受你的建议和改进。

目前,我正在编写AtbashCipher程序,该程序必须加密和解密输入String。与大学的每项任务一样,我们需要遵循一些指导原则,但我将首先解释当前的代码:

import java.util.Scanner;

public class AtbashCipher {

    StringBuilder code = new StringBuilder("");
    String inputString;
    String coded;

    public String getInputString() {
        return this.inputString;
    }

    public void setInputString(String inputString) {
        this.inputString = inputString;
    }

    public String getCoded() {
        return this.coded;
    }

    public void setCoded(String coded) {
        this.coded = coded;
    }

    public char encode(char c) {
        String alphabet = "abcdefghijklmnopqrstuvwxyz";
        char help = Character.toLowerCase(c);
        if (alphabet.indexOf(help) >= 0) {
            for (int i = 0; i < alphabet.length(); i++) {
                if (help == alphabet.toLowerCase().charAt(i)) {
                    c = alphabet.charAt(26 - i - 1);
                    code.append(c);
                }
            }
        } else {
            code.append(c);
        }

        if (inputString.length() == code.length()) {
            System.out.println("Encode: " + code);
            coded = code.toString();
            inputString = coded;
            code.setLength(0);
        }
        return c;
    }

    public char decode(char c) {
        String alphabet = "abcdefghijklmnopqrstuvwxyz";
        char help = Character.toLowerCase(c);
        if (alphabet.indexOf(help) >= 0) {
            for (int i = 0; i < alphabet.length(); i++) {
                if (help == alphabet.toLowerCase().charAt(i)) {
                    c = alphabet.charAt(26 - i - 1);
                    code.append(c);
                }
            }
        } else {
            code.append(c);
        }

        if (inputString.length() == code.length()) {
            coded = code.toString();
            inputString = coded;
            System.out.println("Decode: " + code);
            code.setLength(0);
        }
        return c;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        AtbashCipher atb = new AtbashCipher();
        System.out.print("To be translated: ");
        atb.setInputString(sc.nextLine());
        sc.close();
        for (int j = 0; j < atb.getInputString().length(); j++) {
            char help = atb.getInputString().charAt(j);
            atb.encode(help);
        }
        for (int k = 0; k < atb.getInputString().length(); k++) {
            char help = atb.getInputString().charAt(k);
            atb.decode(help);
        }
    }
}

此代码对inputString进行加密和解密,仍然需要用Scanner-Input替换,但这不是问题。 我们需要使用解码和编码方法,这在我的代码中基本相同,但我们还是需要拆分它。难道我做错了什么? (见编辑,是的,我做错了。)

问题始于任务:  我们需要编写一个实现AtbashWriter的类java.io.Writer,然后构造函数需要获取这些参数:

public AtbashWriter(Writer base, AtbashCipher cipher)

此外,我们需要覆盖Java提供的writeflushclose方法。

public void write(char[] cbuf, int off, int len)
public void flush()
public void close()

我们也需要为Reader做同样的事情。

我真的很难接受这个创建我自己的Stream并将其实现到我的代码中的概念。

您能否向我解释一下它是如何工作的以及我的代码如何更有效率?错误等?

请不要只链接java库,因为我在理解库中的概念时遇到了一些困难,我总是查看一些例子。

这项任务来自大学,但我没有得到任何成绩,我只是想这样做并练习考试。

感谢每一位帮助。 谢谢:)

编辑:我无法修改帖子的第一行,所以...嘿伙计们。 Edit2:我刚刚看到我的方法没有完全按照我想要的方式运行,我会尝试纠正它们。 编辑3:我编辑了程序,试图今天发布作者。

Edit4:迟到了,但仍然没有忘记:我完成了它并将其添加到此处,问题解决了:)

private Reader base;
private AtbashCipher cipher;

public AtbashReader(Reader base, AtbashCipher cipher) {
    this.base = base;
    this.cipher = cipher;
}

public int read (char[] cbuf, int off, int len) throws IOException{
    int result= base.read(cbuf, off, len);

    for(int i = off; i < (off+len); i++){
        cbuf[i] = cipher.decode(cbuf[i]);
    }
    return result;
}

public void close()throws IOException {
    base.close();
}

1 个答案:

答案 0 :(得分:1)

我会试着做个比喻。假设您已经有一台能够重新绘制汽车的机器。这很简单:你给它一辆车,然后机器涂上它。这台机器相当于Writer,它接受​​一个char数组并写入它。

现在,问题是汽车在涂漆前需要清洗。那么,你怎么能制造一台洗车的机器,然后涂上它。您可以从头开始构建新机器。或者你可以建立一台重用喷漆机的机器。你的机器会开车,洗车(这是你的工作),然后将洗过的车送到现有的机器上。这个大机器是你的AtbashWriter:它写了char数组,但在写它们之前,它会对它们进行编码。它是如何做到的?通过编码char数组,然后将其传递给已经知道如何编写的机器:base Writer。

所以,基本上,你的write()方法应如下所示:

public void write(char[] cbuf, int off, int len) {
    // transform the dirty car into a washed car
    char[] encodedChars = encode(cbuf, off, len);

    // paint the washed car
    baseWriter.write(encodedChars, 0, encodedChars.length);
}

希望这可以让你开始。