gpt4 book ai didi

java - OneTimePad 实现失败。也许是流问题?

转载 作者:行者123 更新时间:2023-12-04 06:46:23 25 4
gpt4 key购买 nike

我有一些时间,并决定实现一次性垫只是为了乐趣和自我教育。现在我最终得到了一个奇怪的数据行为。它让我发疯^^。你能帮我吗?提前致谢。

有一种 encrypt 方法可以作为参数:

  • InputStream对于纯文本
  • OutputStreams为密文
  • 和一个 OutputStreams为 key 。

  • 有一种解密方法可以作为参数:
  • InputStream为密文
  • InputStream用于 key
  • OutputStreams对于纯文本。

  • 有一个主要的方法来测试和调试代码。这是类(class):
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.security.SecureRandom;

    public class MyPad {

    public static void encrypt(InputStream plainTextInputStream, OutputStream cipherTextOutputStream, OutputStream keyOutputStream) {
    int plainTextByte;
    SecureRandom random = new SecureRandom();
    System.out.println("plain\tkey\tcipher");
    try {
    while((plainTextByte = plainTextInputStream.read()) != -1){
    int keyByte = random.nextInt(256);
    int cipherTextByte = (plainTextByte + keyByte) % 256;
    System.out.println(plainTextByte + "\t" + keyByte + "\t" + cipherTextByte);
    cipherTextOutputStream.write(cipherTextByte);
    keyOutputStream.write(keyByte);
    }
    plainTextInputStream.close();
    cipherTextOutputStream.close();
    keyOutputStream.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static void decrypt(InputStream cipherTextInputStream, InputStream keyInputStream, OutputStream plainTextOutputStream) {
    int cipherTextByte;
    System.out.println("plain\tkey\tcipher");
    try {
    while((cipherTextByte = cipherTextInputStream.read()) != -1){
    int keyByte = keyInputStream.read();
    int plainTextByte = Math.abs(cipherTextByte - keyByte) % 256;
    System.out.println(plainTextByte + "\t" + keyByte + "\t" + cipherTextByte);
    plainTextOutputStream.write(plainTextByte);
    }
    cipherTextInputStream.close();
    keyInputStream.close();
    plainTextOutputStream.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    String plainText = "This is my plain text.";
    InputStream plainTextInputStream = new ByteArrayInputStream(plainText.getBytes());
    ByteArrayOutputStream cipherTextOutputStream = new ByteArrayOutputStream();
    ByteArrayOutputStream keyOutputStream = new ByteArrayOutputStream();

    System.out.println("------------------------------------ encrypting");
    encrypt(plainTextInputStream, cipherTextOutputStream, keyOutputStream);

    String cipherText = cipherTextOutputStream.toString();
    String key = keyOutputStream.toString();
    System.out.println("plaintext:\t" + plainText);
    System.out.println("ciphertext:\t" + cipherText);
    System.out.println("key:\t" + key);
    InputStream cipherTextInputStream = new ByteArrayInputStream(cipherText.getBytes());
    InputStream keyInputStream = new ByteArrayInputStream(key.getBytes());
    ByteArrayOutputStream plainTextOutputStream = new ByteArrayOutputStream();

    System.out.println("------------------------------------ decrypting");
    decrypt(cipherTextInputStream, keyInputStream, plainTextOutputStream);

    plainText = plainTextOutputStream.toString();
    System.out.println("plaintext:\t" + plainText);
    }

    }

    现在这是我遇到的问题。我加密纯文本并立即解密,但加密的纯文本与原始文本不同。我制作了一些用于调试的输出,看起来我在加密期间写入的数据与我在解密期间读取的数据不同。自己看输出:

    ------------------------------------- 加密
    明文 key 密码
    84 25 109
    104 239 87
    105 86 191
    115 74 189
    32 100 132
    105 17 122
    115 211 70
    32 147 179
    109 104 213
    121 118 239
    32 139 171
    112 244 100
    108 196 48
    97 181 22
    105 226 75
    110 94 204
    32 156 188
    116 92 208
    101 91 192
    120 165 29
    116 177 37
    46 49 95
    纯文本:这是我的纯文本。
    密文:mW���zF���d0K̼��%_
    键: �VJdӓhv��ĵ�^�\[��1
    --------------------- 解密
    明文 key 密码
    84 25 109
    152 239 87
    48 191 239
    2 189 191
    103 86 189
    165 74 239
    91 100 191
    172 17 189
    28 211 239
    44 147 191
    85 104 189
    4 118 122
    169 239 70
    48 191 239
    2 189 191
    50 239 189
    48 191 239
    2 189 191
    7 196 189
    58 181 239
    48 239 191
    2 191 189
    89 189 100
    46 94 48
    217 239 22
    116 191 75
    15 189 204
    96 92 188
    148 91 239
    48 239 191
    2 191 189
    50 189 239
    48 239 191
    2 191 189
    160 189 29
    12 49 37
    96 -1 95
    明文:T�0g�[�,U�020:0Y.�t`�020�`

    这对我来说真的很奇怪。这种差异来自哪里的任何建议?

    提前致谢。

    最佳答案

    有两个问题:

  • 您使用 String#getBytes 来获取要反馈的字节。这意味着它们经历了一轮字符串解码和编码。请注意,加密和解密的 key 字节序列是不同的。您应该改为使用 ByteArrayOutputStream#toByteArray
  • Math.abs(cipherTextByte - keyByte) % 256是错的。 (0 - 1) (mod 256) = 255 而不是 1。你应该使用 (256 + cipherTextByte - keyByte) % 256
  • 关于java - OneTimePad 实现失败。也许是流问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721565/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com