Я написал атаку полным перебором паролей с помощью видеокарт для любых алгоритмов с 32-битным блоком и 64-битным ключом, пароль только в формате BCD, в исходном коде ядра алгоритм TEA, проект написан на c ++ builder 10.4, на видеокарте Radeon RX560 полная атака перебором от 0000000000000000 до 9999999999999999 занимает 54 дня, на видеокарте RTX3070 — 17 дней, кто хорошо знает OpenCL, можно ли ускорить поиск или я выжал все по максимуму ???
файлы проекта: https://drive.google.com/file/d/1Hcb2jl9HA_ZUf_Q6GD0u41z6FJBz5185/view?usp=sharing
ядро:
#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_global_int32_extended_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_extended_atomics : enable
ulong dec2bcd(uint dec)
{
ulong result = 0;
int shift = 0;
while (dec)
{
result += (dec % 10) << shift;
dec = dec / 10;
shift += 4;
}
return result;
}
__kernel void brute(__global const int *KEY, __global const int *DAT, __global int *CADR,
__global int *RETC)
{
union{
ulong key_tmp;
ushort Key[4];
}cs;
int i = get_global_id(0);
ushort Data[2];
cs.Key[3]=(KEY[0]>>16);
cs.Key[2]=(KEY[0]&0xFFFF);
cs.Key[1]=(KEY[1]>>16);
cs.Key[0]=(KEY[1]&0xFFFF);
cs.key_tmp+=dec2bcd(i);
Data[0]=(DAT[0] >> 16);
Data[1]=(DAT[0] & 0xFFFF);
ushort delta = 0x9e37;
ushort sum = (delta<<5);
for (uint n = 0;n < 32; ++n){
Data[1]-=(((Data[0])+cs.Key[1])^(Data[0]+sum)^((Data[0]>>5)+cs.Key[0]));
Data[0]-=(((Data[1]<<4)+cs.Key[3])^(Data[1]+sum)^(Data[1]+cs.Key[2]));
sum -= delta;
}
if ((Data[0]==0x0000) && (Data[1]==0x0000)){
int a=atomic_inc(CADR);
RETC[a*2]=(((cs.Key[3])<<16)+cs.Key[2]);
RETC[a*2+1]=(((cs.Key[1])<<16)+cs.Key[0]);
}
}