这种本土算法对加密安全吗?
Is this home-grown algorithm safe for encryption?
Jasoos(密码算法)
我正在加密和解密网络应用程序。我已经构建了一个算法,该算法使用 24 字节的密钥来 encrypt/decrypt 消息。
回顾这个算法,请提出这个算法中任何重要的和错误的地方,以使其性能更好。您的贡献可以帮助我们改进算法。
我的 GitHub
上提供了代码
算法:-
1] 24 位 entered/generated 密钥将转换为 24 位代码的 ASCII 码。
public void setKey(char[] arr){
for(int i=0;i<24;i++){
key[i] = (int)arr[i];
}
}
2] 输入的字符串将被转换为字符数组。
然后每个字符都会先增加key的值,然后变成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;
}
同样,我们将对 text/string 中的每个字符执行此操作并对其进行加密。
例子:-
密钥: c|H@yLzd3PkRte0H,u16zt8N
消息:abcd ef$
加密后:11001111000001101010000010000101101000001110100000101010111001110000011000001000
按照任何合理的标准,您的算法完全没有价值。最明显的问题是:
您刚刚给了我们一个密钥、明文和相应的编码消息。这会从你的超级机密矩阵中泄露出许多你不应该公开分享的条目。 (加密消息的每个 10 位块都是该数组的一个条目,使用密钥和明文,我可以找出它是哪一个。)
想象一下,如果对手拥有一组已被您的算法加密的消息,然后您发布了这个挑战。他现在可以解密这些消息中的很大一部分,仅根据您在本次挑战中泄露的内容。如果有明显的遗漏位,比如说他有 "trans_ormer",他可以在你以前的超级秘密数组中计算出另一个条目。
但请阅读评论中的链接。试图以这种方式为实际使用和依赖设计自己的加密算法绝对是愚蠢的。一种新算法在经过每种已知密码分析的专家彻底审查之前,甚至不能考虑用于实际使用。
另一个算法缺陷是显而易见的。攻击者将知道密钥每 24 个字符重复一次。如果消息足够长,比如用英语,攻击者可以对每组每 24 个字符进行一次频率分析。如果攻击者知道消息格式并且该格式的频率分布更加不均,情况会更糟。
Jasoos(密码算法)
我正在加密和解密网络应用程序。我已经构建了一个算法,该算法使用 24 字节的密钥来 encrypt/decrypt 消息。
回顾这个算法,请提出这个算法中任何重要的和错误的地方,以使其性能更好。您的贡献可以帮助我们改进算法。
我的 GitHub
上提供了代码算法:-
1] 24 位 entered/generated 密钥将转换为 24 位代码的 ASCII 码。
public void setKey(char[] arr){
for(int i=0;i<24;i++){
key[i] = (int)arr[i];
}
}
2] 输入的字符串将被转换为字符数组。
然后每个字符都会先增加key的值,然后变成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;
}
同样,我们将对 text/string 中的每个字符执行此操作并对其进行加密。
例子:-
密钥: c|H@yLzd3PkRte0H,u16zt8N
消息:abcd ef$
加密后:11001111000001101010000010000101101000001110100000101010111001110000011000001000
按照任何合理的标准,您的算法完全没有价值。最明显的问题是:
您刚刚给了我们一个密钥、明文和相应的编码消息。这会从你的超级机密矩阵中泄露出许多你不应该公开分享的条目。 (加密消息的每个 10 位块都是该数组的一个条目,使用密钥和明文,我可以找出它是哪一个。)
想象一下,如果对手拥有一组已被您的算法加密的消息,然后您发布了这个挑战。他现在可以解密这些消息中的很大一部分,仅根据您在本次挑战中泄露的内容。如果有明显的遗漏位,比如说他有 "trans_ormer",他可以在你以前的超级秘密数组中计算出另一个条目。
但请阅读评论中的链接。试图以这种方式为实际使用和依赖设计自己的加密算法绝对是愚蠢的。一种新算法在经过每种已知密码分析的专家彻底审查之前,甚至不能考虑用于实际使用。
另一个算法缺陷是显而易见的。攻击者将知道密钥每 24 个字符重复一次。如果消息足够长,比如用英语,攻击者可以对每组每 24 个字符进行一次频率分析。如果攻击者知道消息格式并且该格式的频率分布更加不均,情况会更糟。