我必须实现一个Java方法,它将确定输入字符串是哈希(由机器生成)还是纯文本(由人类编写)。
示例:
isThisEncrypted("qwertyuiopasdfghjklzxcvbnm"); // returns true
isThisEncrypted("some normal human text"); // returns false
我想过使用Kolmogorov-Smirnov测试(jsc.goodnessfit.KolmogorovTest),它将检查字符串中的字符是否来自正态分布,但我已经知道,只检查一个短字符串可能不是结论性的。
您是否知道如何在Java中解决此问题(最好使用现有的库)?
答案 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%的准确度;是