当前位置: 首页 > 知识库问答 >
问题:

替代密码在Java

东方旭东
2023-03-14

我试图建立一个替代密码。对于我的密钥,我使用一个随机的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个答案

袁元明
2023-03-14

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

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

刘泰
2023-03-14

正如我所料,你的问题是:

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

你需要做的是在键中找到bye,并将其替换为is offset。

差不多

plain[i] = key.indexof(byes[i]);

但是这当然行不通——你需要折叠你添加到编码中的-128

试着编写一些测试代码,你会得到回复。

 类似资料:
  • 我正在尝试使用Visual Basic创建替代密码。我是编程新手,正在努力,所以请提供一些支持。 密码应执行以下操作: 向用户询问要加密的消息。 向用户索要密钥(或要求系统生成密钥,以更容易编码的为准)。 使用密钥加密消息。 返回加密消息。 例: 留言=你好 字母表:"abcdeghijclmnopqrstuvwxyz" 密钥:"kxgtlmpqbwcnderfahjusviyoz" 返回加密消息

  • 简单替换密码是最常用的密码,包括为每个密文文本字符替换每个纯文本字符的算法。 在这个过程中,与凯撒密码算法相比,字母表是混乱的。 例子 (Example) 简单替换密码的密钥通常由26个字母组成。 一个示例关键是 - plain alphabet : abcdefghijklmnopqrstuvwxyz cipher alphabet: phqgiumeaylnofdxjkrcvstzwb 使用

  • 本文向大家介绍替代密码技术与换位密码技术的区别,包括了替代密码技术与换位密码技术的区别的使用技巧和注意事项,需要的朋友参考一下 替代密码技术 替代密码技术是一种传统的密文技术,用于将纯文本加密为密文。在这种技术中,每个字符都用其他字符/数字或其他符号代替。此技术可更改字符的身份,但不会更改其位置。 换位密码技术 换位密码技术也是一种传统的密文技术,用于将纯文本加密为密文。在此技术中,每个字符位置都

  • 我在用Java做一个随机替换密码。基本上,程序要求你输入一个句子,你输入这个句子,然后使用随机生成的字母表对它进行加密。用户可以选择加密或解密。然后在屏幕上显示加密的密文。如果用户选择这样做,程序将解密密码并显示原始的纯文本消息。 以下是我目前掌握的信息: 这只是生成随机字母表。不过,我不知道如何实现实际的encrypt方法。我可以自己处理文件IO和对用户的提示。我只是不明白如何创建替换算法。非常

  • 我了解到使用char[]在comp.lang.java.*的Usenet天存储密码。 搜索StackOverflow也可以很容易地找到这样的高投票率问题:为什么char[]比String更适合密码?这与我很久很久以前学到的是一致的。 我仍然编写我的API以使用字符[]作为密码。但现在,这仅仅是空洞的理想吗? 例如,看看Atlassian Jira的Java API:LoginManager。aut

  • 我在Spring项目中遇到编码问题。现在我使用 -Dfile.encoding=ISO-8859-1 参数运行 jvm (tomcat)。在我的.jsp文件中有几行: 在 Web 中.xml我定义了编码过滤器 但当我用波兰语字母łśżź传递值时,我遇到了一个问题。在我的java控制器中,打印(并保存在DB中)的值是用html代码代替抛光字母。例如 aaalł保存为aaal[am]#322;[上午]