如何确定字符串是否为哈希值

时间:2013-05-08 10:37:54

标签: java cryptography

我必须实现一个Java方法,它将确定输入字符串是哈希(由机器生成)还是纯文本(由人类编写)。

示例:

isThisEncrypted("qwertyuiopasdfghjklzxcvbnm"); // returns true
isThisEncrypted("some normal human text"); // returns false

我想过使用Kolmogorov-Smirnov测试(jsc.goodnessfit.KolmogorovTest),它将检查字符串中的字符是否来自正态分布,但我已经知道,只检查一个短字符串可能不是结论性的。

您是否知道如何在Java中解决此问题(最好使用现有的库)?

3 个答案:

答案 0 :(得分:3)

来自您的评论:

  

人类输入可以是随机的

     

如果字符串来自此方法或表单,则此方法必须确定   用户

然后就没有办法解决你的问题只有String。您需要额外的信息。

如果您期望Blowfish以给定格式返回String,那么您错了。现代加密算法以高熵为目标,这意味着它们必须具有随机的外观和感觉。

答案 1 :(得分:0)

您将输入拆分为单词并根据字典(checking words in a dictionary)进行检查。

从现在开始,一切都取决于您的实施。 IMO,如果一半的单词与字典匹配,那么你的方法应该返回false。

答案 2 :(得分:0)

您已声明您只需要一个近似解决方案(80%准确度),AClassName形式的类可能(注意大小写),并且加密文本的给定样本中没有大写字母。所以

public class Test{

    public static void main(String args[]){
        String[] tests=new String[5];

        tests[0]="MyClass";
        tests[1]="Short";
        tests[2]="thsrjtyzfgnmytkzrhjstk";
        tests[3]="tatm";
        tests[4]="The result is good";

        for(int i=0;i<tests.length;i++){
            System.out.println(tests[i]+ "- Encrypted:" + isProbablyEncrypted(tests[i]));
        }


    }

    public static boolean isProbablyEncrypted(String in){
        int noOfWords= countOccurrences(in, ' ') + countCaps(in);
        if (noOfWords==0){
            return true;
        }else{
            double averageWordLength=(double)(in.length())/(noOfWords+1);

            if (averageWordLength>15){
                return true;
            }else{
                return false;
            }
        }
    }

    public static int countOccurrences(String haystack, char needle)
    {
        int count = 0;
        for (int i=0; i < haystack.length(); i++)
        {
            if (haystack.charAt(i) == needle)
            {
                 count++;
            }
        }
        return count;
    }

    public static int countCaps(String in){
        int caps=0;
        for (int i=0; i<in.length(); i++) {
            if (Character.isUpperCase(in.charAt(i)))caps++;
        }
        return caps;
    }
}

这是一个很好的解决方案;不,它是否给出了> 80%的准确度;是