-5

Jasoos(密码算法)

我正在加密和解密 Web 应用程序。我已经建立了一个使用 24 字节密钥来加密/解密消息的算法。

查看此算法,并请提出该算法中任何重要和错误的建议,以使其表现更好。您的贡献可以帮助我们改进算法。

代码在我的GitHub 上提供

算法:-

1] 输入/生成的 24 位密钥将转换为 24 位代码的 ASCII 码。

public void setKey(char[] arr){
 for(int i=0;i<24;i++){
   key[i] = (int)arr[i];
 } 
}

2] 输入的字符串会变成字符数组。

然后每个字符将首先使用键的值递增,并变为 10 位二进制代码。

 public void Encryption(String text){
 char[] msg = text.toCharArray();
 int flag = 0;
 int l = msg.length;
 for(int i=0;i<l;i++){
  int a = (int)msg[i];
 // System.out.print(msg[i]+" "+a+"-> ");

 if(flag>23)
     flag=0;
 int b=a+key[flag];
 flag++;
 //System.out.print(b+" | ");
 String z = binary(b);
 sb.append(lookUpTool(z));
 //Character.toString((char)b);
 }
 //sb.append(sumBinary);
 sb = comp1(sb);
}

3]lookUp(): - 它将一个 10 位字符串作为输入和一个矩阵,并将该字符串分成两个 5 位二进制代码。

然后我们将计算每个 5 位二进制代码的十进制值。

示例:0011101101 -> 00111 = 7 和 01101 = 13

我们有一个 32 X 32 维度的矩阵,它具有从 0 到 1023 的唯一随机值,不会公开共享。

对于 0011101101,我们将查找第 7 行和第 13 列的值。该值将更改为 10 位二进制代码。

public String lookUp(String bits, int[][] mat){

int mid = Math.round((float) bits.length() / 2);
String part1 = bits.substring(0, mid);
String part2 = bits.substring(mid, bits.length());
int row=binaryValue(part1);
int col=binaryValue(part2);;


//System.out.print("row: "+row);
// System.out.println("|| col: "+col);
int a = mat[row][col];
return binary(a);

}

4]我们将通过lookUpTool方法对十个不同的私有矩阵执行此步骤十次。

  public String lookUpTool(String s){

   String s1 = lookUp(s,matrix1);
   String s2 = lookUp(s1,matrix2);
   String s3 = lookUp(s2,matrix3);
   String s4 = lookUp(s3,matrix4);
   String s5 = lookUp(s4,matrix5);
   String s6 = lookUp(s5,matrix6);
   String s7 = lookUp(s6,matrix7);
   String s8 = lookUp(s7,matrix8);
   String s9 = lookUp(s8,matrix9);
   String s10 = lookUp(s9,matrix10);

   return s10;

}

同样,我们将对文本/字符串中的每个字符执行此操作并对其进行加密。

示例:-

密钥:c|H@yLzd3PkRte0H,u16zt8N

消息:abcd ef$

加密后:11001111000001101010000010000101101000001110100000101010111001110000011000001000

4

1 回答 1

5

以任何合理的标准衡量,您的算法完全没有价值。最明显的问题是这样的:

您刚刚给了我们一个密钥、明文和相应的编码消息。这会从您的超级机密矩阵中泄露出许多您不应该公开分享的条目。(加密消息的每个 10 位块都是该数组中的一个条目,通过密钥和明文,我可以确定它是哪一个。)

想象一下,如果一个对手有一组已经被你的算法加密的消息,然后你发布了这个挑战。他现在可以解密这些消息中的很大一部分,就在你在这次挑战中泄露的内容中。如果有明显的缺失位,比如他有“trans_ormer”,他可以在你以前的超级秘密数组中计算出另一个条目。

但请阅读评论中的链接。试图以这种方式设计自己的加密算法供实际使用和依赖是绝对愚蠢的。在每种已知密码分析领域的专家彻底审查之前,甚至不能考虑实际使用新算法。

另一个算法缺陷是显而易见的。攻击者会知道密钥每 24 个字符重复一次。有了足够长的信息,比如英语,攻击者可以对每 24 个字符的每组进行频率分析。如果攻击者知道消息格式并且该格式具有更不均匀的频率分布,那就更糟了。

于 2017-07-13T15:10:02.767 回答