Этот домашний алгоритм безопасен для шифрования?
Jasoos (алгоритм криптографии)
Я работаю над шифрованием и дешифрованием веб-приложения. Я построил алгоритм, который использует 24-байтовый ключ для шифрования / дешифрования сообщения.
Просмотрите этот алгоритм и, пожалуйста, предложите что-нибудь важное и ошибочное в этом алгоритме, чтобы он мог работать лучше. Ваш вклад может помочь нам улучшить наш алгоритм.
Код предоставляется на моем GitHub
Алгоритм:-
1] 24-значный введенный / сгенерированный ключ будет преобразован в ASCII-код из 24-значного кода.
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
1 ответ
Ваш алгоритм абсолютно бесполезен по любым разумным стандартам. Наиболее очевидная проблема заключается в следующем:
Вы только что дали нам ключ, открытый текст и соответствующее закодированное сообщение. В результате просачиваются многочисленные записи из вашей суперсекретной матрицы, которыми вы не должны были делиться публично. (Каждый десятибитный фрагмент зашифрованного сообщения является записью из этого массива, и с помощью ключа и открытого текста я могу выяснить, какой это.)
Представьте, что у злоумышленника была коллекция сообщений, которые уже были зашифрованы вашим алгоритмом, а затем вы опубликовали этот вызов. Теперь он может расшифровать значительную часть этих сообщений, как раз из того, что вы просочились в этом испытании. И если есть очевидные пропущенные биты, скажем, у него есть "trans_ormer", он может обработать еще одну запись в вашем ранее суперсекретном массиве.
Но, пожалуйста, прочитайте ссылки в комментариях. Попытка разработать собственный алгоритм шифрования для фактического использования и надежности таким способом абсолютно глупа. Новый алгоритм даже не может быть рассмотрен для фактического использования, пока он не будет тщательно рассмотрен специалистами по каждому типу известного криптоанализа.
Другой алгоритмический недостаток сразу очевиден. Злоумышленник будет знать, что ключ повторяется каждые 24 символа. С помощью достаточно длинного сообщения, скажем, на английском языке, злоумышленник может выполнить частотный анализ для каждого набора каждого 24-го символа. Еще хуже, если злоумышленник знает формат сообщения, и этот формат имеет еще более неравное распределение частот.