source: trunk/CrypPlugins/KeySearcher/OpenCL/KeySearcherOpenCLCode.cs @ 2087

Last change on this file since 2087 was 2087, checked in by Sven Rech, 11 years ago

keysearcher opencl fix

File size: 3.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase;
6using Cryptool.PluginBase.Control;
7using OpenCLNet;
8
9namespace KeySearcher
10{
11    class KeySearcherOpenCLCode
12    {
13        private byte[] encryptedData;
14        private IControlCost controlCost;
15        private IControlEncryption encryptionController;
16        private int maxKeys;
17
18        private IKeyTranslator keyTranslatorOfCode = null;
19        private string openCLCode = null;
20        private Kernel openCLKernel = null;
21
22        public KeySearcherOpenCLCode(byte[] encryptedData, IControlEncryption encryptionController, IControlCost controlCost, int maxKeys)
23        {
24            this.encryptedData = encryptedData;
25            this.encryptionController = encryptionController;
26            this.controlCost = controlCost;
27            this.maxKeys = maxKeys;
28        }
29
30        private string CreateOpenCLBruteForceCode(IKeyTranslator keyTranslator)
31        {
32            if (keyTranslatorOfCode == keyTranslator)
33            {
34                return openCLCode;
35            }
36
37            int bytesUsed = controlCost.getBytesToUse();
38            if (encryptedData.Length < bytesUsed)
39                bytesUsed = encryptedData.Length;
40
41            string code = encryptionController.GetOpenCLCode(bytesUsed);
42            if (code == null)
43                throw new Exception("OpenCL not supported in this configuration!");
44
45            //put cost function stuff into code:
46            code = controlCost.ModifyOpenCLCode(code);
47
48            //put input to be bruteforced into code:
49            string inputarray = string.Format("__constant unsigned char inn[{0}] = {{ \n", bytesUsed);
50            for (int i = 0; i < bytesUsed; i++)
51            {
52                inputarray += String.Format("0x{0:X2}, ", this.encryptedData[i]);
53            }
54            inputarray = inputarray.Substring(0, inputarray.Length - 2);
55            inputarray += "}; \n";
56            code = code.Replace("$$INPUTARRAY$$", inputarray);
57
58            //put key movement of pattern into code:
59            code = keyTranslator.ModifyOpenCLCode(code, maxKeys);
60
61            keyTranslatorOfCode = keyTranslator;
62            this.openCLCode = code;
63
64            //Test:
65            System.IO.TextWriter tw = new System.IO.StreamWriter(@"C:\Users\sven\Test\test.txt");
66            tw.Write(code);
67            tw.Close();
68
69            return code;
70        }
71
72
73        public Kernel GetBruteforceKernel(OpenCLManager oclManager, IKeyTranslator keyTranslator)
74        {
75            if (keyTranslatorOfCode == keyTranslator)
76            {
77                return openCLKernel;
78            }
79
80            try
81            {
82                var program = oclManager.CompileSource(CreateOpenCLBruteForceCode(keyTranslator));
83                openCLKernel = program.CreateKernel("bruteforceKernel");
84                return openCLKernel;
85            }
86            catch (Exception ex)
87            {
88                throw new Exception("An error occured when trying to compile OpenCL code: " + ex.Message);
89            }
90        }
91    }
92}
Note: See TracBrowser for help on using the repository browser.