ключи алгоритма грубой силы с 32-битным блоком и 64-битным ключом с использованием OpenCL

Я написал атаку полным перебором паролей с помощью видеокарт для любых алгоритмов с 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]);

}

}

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *