如何撤消此基本加密?

时间:2013-02-06 19:30:54

标签: java string character

public static String basicEncrypt(String s) {
    String toReturn = "";
    for (int j = 0; j < s.length(); j++) {
        toReturn += (int)s.charAt(j);
    }
    //System.out.println("Encrypt: " + toReturn);
    return toReturn;    
}

有没有办法扭转这个来找到原始字符串?非常感谢。

4 个答案:

答案 0 :(得分:1)

假设您只使用ASCII字符(32-255码),算法很简单:

  1. 取输入的第一个字符

  2. 如果是12 - 取下并切断下两位数并转换为字符

  3. 如果是其他任何字符 - 请删除下一个数字并转换为字符

  4. 如果有一些输入

  5. ,请转到1.

    这是一个快速的scala实现:

    def decrypt(s: String): String = s.headOption match {
        case None => ""
        case Some('1') | Some('2') => s.substring(0, 3).toInt.toChar + decrypt(s.substring(3))
        case Some(_) => s.substring(0, 2).toInt.toChar + decrypt(s.substring(2))
    }
    

答案 1 :(得分:0)

是的,如果考虑到您的原始字符串包含(32)和unicode charcode 299之间的字符,请参阅http://www.asciitable.com/

Psuedo code
ret=<empty string>
while not end of string
  n=next number from string
  if n<3 charcode= n + next 2 numbers
  else
     charcode=n + next number
  ret=ret + character(charcode)
end while

空格下的字符代码(换行符和回车符)以及299以上的字符将阻止此算法。可以修复此算法以包括最多为c​​harcode 319的字符。

答案 2 :(得分:0)

private static String basicDecrypt(String s) {
    String result = "";
    String buffer = "";
    for (int i = 0; i < s.length(); i++) {
        buffer += s.charAt(i);
        if ((buffer.charAt(0) == '1' && buffer.length() == 3) || (buffer.charAt(0) != '1' && buffer.length() == 2)) {
            result += (char) Integer.parseInt(buffer);
            buffer = "";
        }
    }
    return result;
}

这是一种非常基本的解密方法。它仅适用于[A-Za-z0-9]+ US ASCII。

答案 3 :(得分:0)

只是为了它的乐趣,另外两个版本; Java,US-ASCII only,chars 0x14-0xc7;

public static String basicDecrypt(String input)
{
    StringBuffer output = new StringBuffer();
    Matcher matcher = Pattern.compile("(1..|[2-9].)").matcher(input);
    while(matcher.find())
        output.append((char)Integer.parseInt(matcher.group()));
    return output.toString();
}

对于0x1e-0xff,将正则表达式替换为"([12]..|[3-9].)"

......还有一些比较简洁的Linq'y C#版本。

private static string BasicDecrypt(string input)
{
    return new string(Regex.Matches(input, "(1..|[2-9].)").Cast<Match>()
                           .Select(x => (char) Int32.Parse(x.Value)).ToArray());
}