1

私のソリューションで srp6 spr4net ( https://code.google.com/p/srp4net/ ) の実装を使用しようとしました。そのため、クライアント側を JavaScript から C# に書き直し、WinForm アプリにしました。そして疑問に思ったのは、そのセッション キーが一致しないということです。私は一日中それを解決しようとしましたが、結果はありませんでした.

ここに私のsrp6a実装があります:

        #region SRP6a client side

        // a - ephemeral private key
        // a = random between 2 and N-1
        var a = new BigInteger();
        {
            a.genRandomBits(Crypto.SRP.N.bitCount(), new Random());
            if (a >= Crypto.SRP.N) a = a%(Crypto.SRP.N - 1);
            if (a < 2) a = 2;
        }

        // A - public key
        // A = g ^ a (mod N)
        var A = Crypto.SRP.g.modPow(a, Crypto.SRP.N);
        var AHex = A.ToHexString();

            // AuthStep 1
            SRPReturn_AuthStep1 authStep1 = NETi.AuthStep1(_name, AHex);
            if (authStep1.error != 0)
                Status = "AuthStep1 error";
            // reg. Salt
            var SHex = authStep1.data.s;
            // BHex
            var BHex = authStep1.data.B;
            // u - scrambling parameter
            // u = H (A || B)

            var u = new BigInteger(authStep1.data.u, 16);
            var uHex = authStep1.data.u;

            //AuthStep 2
            var B = new BigInteger(BHex, 16);
            BigInteger x;
            {
                var xtmp = new BigInteger(HHex(
                    SHex + _name + _password
                    ), 16);
                if (xtmp < Crypto.SRP.N)
                {
                    x = xtmp;
                }
                else
                {
                    x = xtmp%(Crypto.SRP.N - new BigInteger("1", 16));
                }
            }
            var g = Crypto.SRP.g;
            var k = Crypto.SRP.k;
            var N = Crypto.SRP.N;
            var kgx = k*(g.modPow(x, N));
            var aux = a + u*x;
            var S = ((B - kgx)%N).modPow(aux, N); // Client Session Key
            var KHex = HHex(S.ToHexString());
            SessionKey = KHex;
            var m1 = HHex(A.ToHexString() + B.ToHexString() + KHex);
            SRPReturn_AuthStep2 y = NETi.AuthStep2(_name, authStep1.data.uniq1, m1);

        #endregion

...そしてサーバー側.. ( http://code.ohloh.net/file?fid=Xxqdu2GY4_w8UD2b_4VNP_5Cp9I&cid=bLhc6E0xdjo&s=&fp=31372&projSelected=true#L0 )

        public static void AuthStep2(
            string vHex,
            string uHex,
            string AHex,
            string bHex,
            string BHex,
            out string m1serverHex,
            out string m2Hex)
        {
            BigInteger v = new BigInteger(vHex, 16);
            BigInteger u = new BigInteger(uHex, 16);
            BigInteger A = new BigInteger(AHex, 16);
            BigInteger b = new BigInteger(bHex, 16);
            BigInteger B = new BigInteger(BHex, 16);

            // S - common exponential value
            // S = (A * v^u) ^ b (mod N)
            BigInteger S = ((v.modPow(u, N) * A) % N).modPow(b, N); // Server Session Key


            Console.WriteLine(S);
            // K - the strong cryptographically session key
            // K = H(S)
            string KHex = HHex(S.ToHexString()).TrimStart('0');

            Console.WriteLine(KHex);

            // m2 - expected client's proof as computed by the server
            m1serverHex = HHex(
                AHex +
                BHex +
                KHex).TrimStart('0');

            // m2 - server's proof that it has the correct key
            m2Hex = HHex(
                AHex +
                m1serverHex +
                KHex).TrimStart('0');
        }

おそらくセッション キーの式に誤りがあるのでしょうが、どこにあるのかわかりません :C

4

0 に答える 0