Java中的替代密码

Java中的替代密码,java,encryption,substitution,Java,Encryption,Substitution,我正试图设置一个替换密码。对于我的密钥,我使用一个随机的256字节数组,它是256个可能字节值的排列 这是通过以下方式设置的: public Substitute() { key = new byte[256]; List<Byte> list = new ArrayList<Byte>(); for(int i = -128; i < 128; i++) { list.add((byte)i); }

我正试图设置一个替换密码。对于我的密钥,我使用一个随机的256字节数组,它是256个可能字节值的排列

这是通过以下方式设置的:

public Substitute()
{
    key = new byte[256];
    List<Byte> list = new ArrayList<Byte>();

    for(int i = -128; i < 128; i++)
    {
        list.add((byte)i);
    }
    Collections.shuffle(list);
    Byte[] tmp = new Byte[256];
    tmp = list.toArray(tmp);

    for(int i = 0; i < 256; i++)
    {
        key[i] = tmp[i];        
    }
}
public Substitute()
{
key=新字节[256];
列表=新的ArrayList();
for(int i=-128;i<128;i++)
{
列表.添加((字节)i);
}
集合。洗牌(列表);
字节[]tmp=新字节[256];
tmp=列表到阵列(tmp);
对于(int i=0;i<256;i++)
{
键[i]=tmp[i];
}
}
然后,我使用以下方法对消息进行编码/解码:

public byte [] encode(String S)
{
    byte[] plain = S.getBytes();
    byte[] encoded = new byte[plain.length]; 

    for(int i = 0; i < plain.length; i++)
        encoded[i] = (byte)(key[plain[i]]);

    return encoded;
}

public String decode(byte [] bytes)
{
    byte[] plain = new byte[bytes.length];

    for(int i = 0; i < bytes.length; i++)
        plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));

    return new String(plain);
}
公共字节[]编码(字符串S)
{
字节[]普通=S.getBytes();
byte[]encoded=新字节[plain.length];
for(int i=0;i
在这过程中出现了一些问题,我解码的任何东西都会作为一个
ÿ

我不确定我哪里做错了,或者这是否是最有效的做事方式。我必须保持相同的函数签名和通用方法,但具体实现细节由我决定


非常感谢您的帮助。

我想您已经猜到了,您的问题是:

plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));
您需要做的是在
键中找到bye,并将其替换为is offset

差不多

plain[i] = key.indexof(byes[i]);
但这当然行不通——您需要将添加到编码中的
-128
折叠起来


尝试编写一些测试代码-会给你回复。

ans OldCurmudegeon说,问题在于:

plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));
所以我修改了我的程序,加入了一个与密钥相反的
解密密钥
,允许我为每个值找到索引

反之亦然:

public byte [] reverseKey(byte[] key)
{
    byte[] reverse = new byte[key.length];
    for(int i = 0; i < 256; i++)
    {
        reverse[key[i] + 128] = (byte)i; //makes sure to account for negative values.
    }

    return reverse;
}

据我所知,这是功能性的。

谢谢!我已经修改了我的程序,这是我现在拥有的,它似乎正在工作。。。然而,我正在和其他程序一起使用它,它导致了崩溃…那个问题是我在别处犯的小错误。据我所知,我发布的解决方案是准确的
public String decode(byte [] bytes)
{
    byte[] plain = new byte[bytes.length];

    for(int i = 0; i < bytes.length; i++)
        plain[i] = (byte)decryptKey[bytes[i] + 128];

    return new String(plain);
}