source: trunk/PKCS1/Library/KuehnSignature.cs @ 1650

Last change on this file since 1650 was 1650, checked in by schomburg, 11 years ago

initial commit of PKCS1 Plugin

File size: 4.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.IO;
6using Org.BouncyCastle.Utilities.Encoders;
7using Org.BouncyCastle.Math;
8
9namespace PKCS1.Library
10{
11    class KuehnSignature : Signature
12    {
13        public override void GenerateSignature()
14        {
15            this.m_KeyLength = RSAKeyManager.getInstance().RsaKeySize; // Länge des RSA Modulus
16            string message = Datablock.getInstance().Message; // Die Nachricht für welche die Signatur erstellt werden soll
17            HashFunctionIdent hashFuncIdent = Datablock.getInstance().HashFunctionIdent; // Die vom User gewählte Hashfunktion
18            byte[] hashIdent = Hex.Decode(Encoding.ASCII.GetBytes(hashFuncIdent.DERIdent)); // ASN.1 codierter Ident-string
19
20            // Datenblock wird konstruiert
21            byte[] A = new byte[46];
22            A[0] = 0x00;
23            A[1] = 0x01;
24            for (int i = 2; i < 10; i++)
25            {
26                A[i] = 0xFF;
27            }
28            A[10] = 0x00;         
29            Array.Copy(hashIdent, 0, A, 11, hashIdent.Length);         
30            // Datenblock noch ohne Hashwert, wird in while Schleife unten hinzugefügt
31
32            // byte array der kompletten Signatur, wird zuerst mit 'FF' gefüllt und dann nachher Datenblock an den Anfang kopiert
33            byte[] S = new byte[128]; // 1024 bit
34            for (int i = A.Length; i < S.Length; i++)
35            {
36                S[i] = 0xFF;
37            }
38
39            BigInteger finalSignature = null;
40            byte[] bMessage = Encoding.ASCII.GetBytes(message);
41            int iMsgLength = bMessage.Length;
42
43            bool isEqual = false;
44            int limit = 250000;
45            int countLoops = 0;
46
47            while (!isEqual && (countLoops < limit))
48            {
49                //byte[] hashDigest = Hashfunction.generateHashDigest(message, hashFuncIdent); // Hashwert wird erzeugt
50                byte[] hashDigest = Hashfunction.generateHashDigest(bMessage, hashFuncIdent); // Hashwert wird erzeugt
51                Array.Copy(hashDigest, 0, A, 11 + hashIdent.Length, hashDigest.Length); // erzeugter Hashwert wird in den Datenblock kopiert
52                Array.Copy(A, 0, S, 0, A.Length); // erzeugter Datenblock wird in erzeugte Signatur S kopiert
53
54                //string test = Encoding.ASCII.GetString(Hex.Encode(S));
55                /*
56                ///////////////////////////////////////////////////////////////////////////////////////////
57                // nur testweise
58                string test1 = Encoding.ASCII.GetString(Hex.Encode(S));
59                BigInteger fakegarbage = BigInteger.ValueOf(125);
60                Array.Copy(fakegarbage.ToByteArray(), 0, S, A.Length, fakegarbage.ToByteArray().Length);
61                string test2 = Encoding.ASCII.GetString(Hex.Encode(S));
62                //
63                //////////////////////////////////////////////////////////////////////////////////////////
64                */
65
66                finalSignature = MathFunctions.cuberoot2(new BigInteger(S)); // Kubikwurzel ziehen
67                BigInteger T = finalSignature.Pow(3); // mit 3 potenzieren
68                byte[] resultArray = new byte[128]; // damit verglichen werden kann in byte array kopieren
69
70                // durch Konvertierung in BigInteger werden führende Nullen abgeschnitten,
71                // daher wird an Stelle 1 in byte array kopiert.
72                Array.Copy(T.ToByteArray(), 0, resultArray, 1, T.ToByteArray().Length);
73
74                //string test2 = Encoding.ASCII.GetString(Hex.Encode(resultArray));
75               
76
77                isEqual = MathFunctions.compareByteArray(resultArray,S,45); // byte arrays vergleichen, wird in meinen Tests nicht erreicht
78                if (!isEqual)
79                {
80                    byte[] tmp1 = { bMessage[iMsgLength - 3], bMessage[iMsgLength - 2], bMessage[iMsgLength - 1] };
81
82                    BigInteger tmp2 = new BigInteger(tmp1);
83                    tmp2 = tmp2.Add(BigInteger.One);
84                    tmp1 = tmp2.ToByteArray();
85
86                    Array.Copy( tmp1, 0, bMessage, bMessage.Length-3,3);
87                    countLoops++;
88                }
89            }
90
91            Datablock.getInstance().Message = message;
92
93            byte[] returnByteArray = new byte[this.m_KeyLength/8];
94            Array.Copy(finalSignature.ToByteArray(), 0, returnByteArray, returnByteArray.Length - finalSignature.ToByteArray().Length, finalSignature.ToByteArray().Length);
95
96            this.m_Signature = returnByteArray;
97            this.m_bSigGenerated = true;
98            this.OnRaiseSigGenEvent(SignatureType.Kuehn);
99        }     
100    }
101}
Note: See TracBrowser for help on using the repository browser.