Tog mig lige lidt længere tid end jeg tør indrømme,  men det var os det jeg kom frem til. dette blev den kode jeg endte op med. :)
        public string GenerateResponse(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
        {
            byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($"AUTHENTICATE:{digesturi}"): Encoder.GetBytes($"AUTHENTICATE:{digesturi}:00000000000000000000000000000000"));
            byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
            byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");
            byte[] A1 = Merge(h1,h2);
            byte[] response_value = HEX(KD(HEX(H(A1)),
                Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
                ));
            byte[] h3 = Merge(h1, h2);
            return Encoder.GetString(response_value);
        }
        public string GenerateHash(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
        {
            byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($":{digesturi}") : Encoder.GetBytes($":{digesturi}:00000000000000000000000000000000"));
            byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
            byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");
            byte[] A1 = Merge(h1, h2);
            byte[] response_value = HEX(KD(HEX(H(A1)),
                Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
                ));
            byte[] h3 = Merge(h1, h2);
            return Encoder.GetString(response_value);
        }
        /// <summary>
        /// Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s.
        /// </summary>
        /// <param name="s">Byte Array Af streng for at sikre encodning</param>
        /// <returns>s -> Base16(s) = s16 -> MD5Hash(s16)</returns>
        public byte[] H(byte[] s)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            return md5.ComputeHash(s);
        }
        /// <summary>
        /// Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string k, a colon and the string s.
        /// </summary>
        /// <param name="k">Byte Array Af streng for at sikre encodning</param>
        /// <param name="s">Byte Array Af streng for at sikre encodning</param>
        /// <returns>k + ":" + s = ks -> H(ks)</returns>
        public byte[] KD(byte[] k, byte[] s)
        {
            byte[] colon = Encoder.GetBytes(":");
            byte[] ks = Merge(k, colon, s);
            return H(ks);
        }
        /// <summary>
        /// Let HEX(n) be the representation of the 16 octet MD5 hash n as a string of 32 hex digits(with alphabetic characters always in lower case, since MD5 is case sensitive).
        /// </summary>
        /// <param name="n">Byte Array Af streng for at sikre encodning</param>
        /// <returns>lowercase of n</returns>
        public byte[] HEX(byte[] n)
        {
            byte[] b = Encoder.GetBytes(toBase16(n).ToLower());
            return b;
        }
        /// <summary>
        /// Merge byte arrays, Hurtig Merge af de mange byte arrays denne classe arbejder med
        /// </summary>
        /// <param name="ns">Array med Arrays af byte samlinger der kan oversættes med en Encoder til tekst</param>
        /// <returns></returns>
        public byte[] Merge(params byte[][] ns)
        {
            int index = 0;
            int length = 0;
            byte[] merged_n;
            foreach(byte[] n in ns)
            {
                length += n.Length;
            }
            merged_n = new byte[length];
            for(int arri = 0; arri < ns.Length; arri++)
            {
                Array.Copy(ns[arri], 0, merged_n, index, ns[arri].Length);
                index += ns[arri].Length;
            }
            return merged_n;
        }