コード例 #1
0
        public static IServerDHParams GetResponse(RequestReqDHParams reqDhParams, string privateKey, out AsymmetricCipherKeyPair serverKeyPair, out byte[] newNonce)
        {
            var pqInnerData = DeserializeRequest(reqDhParams, privateKey);

            GeneratePandG(out var p, out var g);

            KeyGenerationParameters kgp = new DHKeyGenerationParameters(new SecureRandom(), new DHParameters(p, BigInteger.ValueOf(g)));
            var keyGen = GeneratorUtilities.GetKeyPairGenerator("DH");

            keyGen.Init(kgp);

            serverKeyPair = keyGen.GenerateKeyPair();

            var publicKey = (DHPublicKeyParameters)serverKeyPair.Public;

            var dhInnerData = new TServerDHInnerData
            {
                DhPrimeAsBinary = publicKey.Parameters.P.ToByteArray(),
                Nonce           = pqInnerData.Nonce,
                ServerNonce     = pqInnerData.ServerNonce,
                G          = publicKey.Parameters.G.IntValue,
                GAAsBinary = publicKey.Y.ToByteArray(),
                ServerTime = (int)((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds()
            };

            newNonce = pqInnerData.NewNonce;

            return(SerializeResponse(pqInnerData, dhInnerData));
        }
コード例 #2
0
        private static TPQInnerData Decrypt(RequestReqDHParams requestReqDhParams, out byte[] checksum)
        {
            var decryptedResponse = RSAHelper.RsaDecryptWithPrivate(requestReqDhParams.EncryptedDataAsBinary, PrivateKey);

            var decryptedResponseBuffer = PooledByteBufferAllocator.Default.Buffer();

            decryptedResponseBuffer.WriteBytes(decryptedResponse);

            checksum = new byte[20];
            decryptedResponseBuffer.ReadBytes(checksum);

            return((TPQInnerData)Serializer.Deserialize(decryptedResponseBuffer));
        }
コード例 #3
0
        private static TPQInnerData DeserializeRequest(RequestReqDHParams reqDhParams, string privateKey)
        {
            var encryptedData = reqDhParams.EncryptedDataAsBinary;

            var innerDataWithHash = RSAHelper.RsaDecryptWithPrivate(encryptedData, privateKey);

            var shaHashsum = innerDataWithHash.Take(20).ToArray();

            var innerData = innerDataWithHash.Skip(20).ToArray();

            var hashsum = Sha1Helper.ComputeHashsum(innerData);

            Guard.That(shaHashsum).IsItemsEquals(hashsum);

            var innerDataBuffer = PooledByteBufferAllocator.Default.Buffer(innerData.Length);

            innerDataBuffer.WriteBytes(innerData);

            return(Serializer.Deserialize(innerDataBuffer).Is <TPQInnerData>());
        }