在Java中替换密码

时间:2014-07-14 22:13:01

标签: 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);
    }
    Collections.shuffle(list);
    Byte[] tmp = new Byte[256];
    tmp = list.toArray(tmp);

    for(int i = 0; i < 256; i++)
    {
        key[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);
}

在此过程中出现了问题,我解码的任何内容都会以ÿ

的字符串形式返回

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

感谢任何和所有帮助。

2 个答案:

答案 0 :(得分:1)

您的问题 - 正如我所期待您猜测的那样 - 来自:

plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));

您需要做的是在key中找到再见,并将其替换为偏移量。

这样的东西
plain[i] = key.indexof(byes[i]);

但这当然不会奏效 - 而且你需要折叠你添加到编码中的-128

尝试将一些测试代码放在一起 - 会回复给您。

答案 1 :(得分:1)

这个问题,而OldCurmudegeon说,问题是:

plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));

所以我修改了我的程序以包含一个decryptKey,它与键的反面相反,允许我为每个值找到索引。

反过来就是:

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

然后我调整了我的解码方法以使用这个新的decryptKey

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

据我所知,这是有用的。