Java一次填充2个字节的数组

问题描述 投票:1回答:1

我试图填充一个字节数组,一次2个字节。我的hw是密码学hw。我要使用密钥从给定的密文中找到纯文本。密钥长度为2个字节。纯文本用很多时间垫加密。密钥重复直到纯文本为止。我得到了密钥的前2个字节,现在我只需要重复它直到它的密文/纯文本。

与纯文本长度相同的密文长度是640138.密钥应该也是这个长度,但是我在应用下面的解决方案后得到的密钥长度是640144.在下面做Math.min而不是Math.max给出错误String.checkBoundsBeginEnd。我不得不将其转换为字符串,因为构建器是StringBuilder类型。在这种情况下,“结果”是关键。

只要密文长度,我如何制作密钥?

    byte[] cipherText = Files.readAllBytes(Paths.get("src/cipher3.bmp"));
    byte[] plainText = new byte[cipherText.length];

    byte[] pText = new byte[]{'B', 'M'};
    byte[] key = new byte[pText.length];
    for(int i = 0; i < pText.length; i++){
        key[i] = (byte)(cipherText[i] ^ pText[i]);
    }
    String keyString = Arrays.toString(key);
    System.out.println("The key " + keyString);
    System.out.println("First two in ptext"+ Arrays.toString(pText));
    System.out.println(plainText.length);

    String plainlength = (String) Arrays.toString(new int[]{plainText.length});
    System.out.println(plainlength);
    StringBuilder builder = new StringBuilder(cipherText.length);
    while(builder.length() < cipherText.length){
        builder.append(keyString.substring(0, Math.max(keyString.length(), builder.length() -cipherText.length)));
    }
    String result = builder.toString();
    System.out.println(result);
    System.out.println(result.length());//this gives 640144
java arrays byte
1个回答
2
投票

应该使用Math.min来正确填充。该

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-640138

让你知道出了什么问题。负面输入应用于subString方法,显然它必须是Math.min(keyString.length(), builder.length() -cipherText.length。由于cipherText长度必须大于或等于builder长度,因此应交换参数以给出正确的结果。

public class Fill2ByteToArray {
    public static void main(String[] args) throws IOException {
        int targetLength = 640138;
        byte[] cipherText = new byte[targetLength];
        for (int i = 0; i < cipherText.length; i++) {
            cipherText[i] = Integer.valueOf(i).byteValue();
        }
        byte[] plainText = new byte[cipherText.length];

        byte[] pText = new byte[] { 'B', 'M' };
        byte[] key = new byte[pText.length];
        for (int i = 0; i < pText.length; i++) {
            key[i] = (byte) (cipherText[i] ^ pText[i]);
        }
        String keyString = Arrays.toString(key);
        System.out.println("The key " + keyString);
        System.out.println("First two in ptext" + Arrays.toString(pText));
        System.out.println(plainText.length);

        String plainlength = (String) Arrays.toString(new int[] { plainText.length });
        System.out.println(plainlength);
        StringBuilder builder = new StringBuilder(cipherText.length);
        while (builder.length() < cipherText.length) {
            builder.append(keyString.substring(0, Math.min(keyString.length(), cipherText.length-builder.length())));
        }
        String result = builder.toString();
        System.out.println(result);
        System.out.println(result.length());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.