Helper method to shuffle cards list for online gaming I have written this code to shuffle a deck of cards. I would like to hear your inputs.

public static class Helper
{

    public static Int32 GetRandomNo(this RNGCryptoServiceProvider rng, byte[] data)
    {
        rng.GetBytes(data);
        var randomNo = BitConverter.ToInt32(data, 0);
        return randomNo;
    }

    public static void Shuffle&lt;T&gt;(this List&lt;T&gt; source)
    {
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            // Buffer storage.
            byte[] data = new byte[4];

            source =
                source.Select(element =&gt; new {element, randomValue = rng.GetRandomNo(data)})
                    .OrderBy(entry =&gt; entry.randomValue)
                    .Select(entry =&gt; entry.element)
                    .ToList();
        }
    }
}
4 bytes is only 4,294,967,296
Consider there are 52! possible shuffles = 8 * 10^67  

Use a proper shuffle like Fisher Yates. You get a proper shuffle with only 0-51 random.  Also shuffle from the prior shuffle (not a sorted deck). If you look closely Fisher Yates it produces exactly 52! deals.  It is perfect. 

I am not sure about your algorithm but I think the problem is that it will produce too many shuffles and they will not have uniform distribution.  I think it will produce 52^52 deals. 

A perfect random with a less than perfect algorithm is a bigger vulnerability than a perfect algorithm and a less than perfect random.  

You can use the regular Random and a proper algorithm and not be exploited unless they know the seed.  But it does not hurt to use RNGCryptoServiceProvider.

Poker security