Пример #1
0
        private byte[] getCompleteHw()
        {
            byte[]            bDerHashIdent = Hex.Decode(Datablock.getInstance().HashFunctionIdent.DERIdent);
            byte[]            bMessage      = Datablock.getInstance().Message;
            HashFunctionIdent hashIdent     = Datablock.getInstance().HashFunctionIdent;

            byte[] hashDigest  = Hashfunction.generateHashDigest(ref bMessage, ref hashIdent);
            byte[] returnArray = new byte[bDerHashIdent.Length + Hashfunction.getDigestSize()];
            Array.Copy(bDerHashIdent, 0, returnArray, 0, bDerHashIdent.Length);
            Array.Copy(hashDigest, 0, returnArray, returnArray.Length - hashDigest.Length, hashDigest.Length);

            return(returnArray);
        }
Пример #2
0
        public override bool GenerateSignature()
        {
            this.SendGuiLogMsg("Message Generation started", NotificationLevel.Info);

            this.m_KeyLength = RsaKey.Instance.RsaKeySize;

            int        hashDigestLength = Hashfunction.getDigestSize() * 8;                              // weil Size in Byte zurückgegeben wird
            int        hashIdentLength  = Datablock.getInstance().HashFunctionIdent.DERIdent.Length * 4; // weil ein zeichen im string = 4 bit
            int        keyLength        = this.m_KeyLength;
            BigInteger derIdent         = new BigInteger(Datablock.getInstance().HashFunctionIdent.DERIdent, 16);
            BigInteger datablockLength  = BigInteger.ValueOf(hashDigestLength + hashIdentLength + 8); // Länge Datenblock inkl 0-Byte (=8Bit)

            bool       isDivByThree = false;
            BigInteger N            = null;
            BigInteger datablock    = null;

            while (false == isDivByThree)
            {
                byte[]            bMessage   = Datablock.getInstance().Message;
                HashFunctionIdent hashIdent  = Datablock.getInstance().HashFunctionIdent;
                BigInteger        hashDigest = new BigInteger(1, Hashfunction.generateHashDigest(ref bMessage, ref hashIdent));
                // T*2^160 + H
                datablock = derIdent.Multiply(BigInteger.Two.Pow(hashDigestLength)).Add(hashDigest); // Datablock erstellen; T=HashFuncIdent; H=HashDigest
                N         = (BigInteger.Two.Pow(datablockLength.IntValue)).Subtract(datablock);      // N muss vielfaches von 3 sein

                if (0 == (N.Mod(BigInteger.Three)).IntValue)
                {
                    isDivByThree = true;
                }
                else
                {
                    byte[] extSign = Encoding.ASCII.GetBytes(ChangeSign);
                    byte[] tmp     = new byte[Datablock.getInstance().Message.Length + extSign.Length];
                    Array.Copy(Datablock.getInstance().Message, tmp, Datablock.getInstance().Message.Length);
                    Array.Copy(extSign, 0, tmp, Datablock.getInstance().Message.Length, extSign.Length);
                    Datablock.getInstance().Message = tmp;
                }
            }

            BigInteger sigLengthWithoutZeros = BigInteger.ValueOf(this.m_KeyLength - 15); // 15 weil die ersten 15 bit 0 sind
            BigInteger startPos          = BigInteger.ValueOf(this.m_dataBlockStartPos);
            BigInteger endPos            = startPos.Add(datablockLength);
            BigInteger sigLengthDivThree = sigLengthWithoutZeros.Divide(BigInteger.Three);

            BigInteger testbeta = endPos.Subtract(BigInteger.Two.Multiply(sigLengthDivThree)).Subtract(datablockLength); // sollte 34 seinbei keylength 3072

            //2^3057 - 2^ (2038 + 288 + 34) == 2^3057 - 2^2360
            BigInteger fakeSig = (BigInteger.Two.Pow(sigLengthWithoutZeros.IntValue)).Subtract(BigInteger.Two.Pow(2 * sigLengthDivThree.IntValue + datablockLength.IntValue + testbeta.IntValue));

            // 2^3057 - 2^2360 + 2^2072 * N
            fakeSig = fakeSig.Add((BigInteger.Two.Pow(startPos.IntValue)).Multiply(datablock));
            fakeSig = fakeSig.Add(BigInteger.Two.Pow(startPos.IntValue - 8).Multiply(BigInteger.ValueOf(125))); // add garbage

            BigInteger fakeSigResult = MathFunctions.cuberoot(fakeSig);

            byte[] returnByteArray = new byte[this.m_KeyLength / 8]; // KeyLength is in bit
            Array.Copy(fakeSigResult.ToByteArray(), 0, returnByteArray, returnByteArray.Length - fakeSigResult.ToByteArray().Length, fakeSigResult.ToByteArray().Length);

            this.m_Signature     = returnByteArray;
            this.m_bSigGenerated = true;
            this.OnRaiseSigGenEvent(SignatureType.Bleichenbacher);
            return(true);
        }