Developing card game, some questions

Options

I'm working on card game. I want to implement mechanic like f.e. in Hearthstone where u can steal card from opponent deck. Please tell me is my way of approach is correct.
For now I store players deck as List. So when game starts clients are not aware of other client deck. I want to pass that information as hidden as I can to prevent any cheating. Below my ideas.
1. Spawn all cards at runtime, list them and shuffle. Now when I call RPC to shuffle that list are the orders on all clients will be the same? After shuffle I want to tag each one with different tag and send to other client only tags of current deck but will them be the same on both clients?
2. What with RNG. If I call Random.Range in RPC would number be the same on both clients? Instead of Shuffle I could generate number which will be index of list, assign tag and remove if from list but again is it the same number on both?
Or am I completely wrong and there is good way to do that.

I try to avoid passing Game Object names because I think it would be too easy to access.