// b - big endian bytes // g - serialized data // dhPrime - serialized data // returns big-endian G_B public static byte[] GetGB(byte[] bData, TLInt gData, TLString pString) { //var bBytes = new byte[256]; // big endian bytes //var random = new Random(); //random.NextBytes(bBytes); var g = new BigInteger(gData.Value); var p = pString.ToBigInteger(); var b = new BigInteger(bData.Reverse().Concat(new byte[] { 0x00 }).ToArray()); var gb = BigInteger.ModPow(g, b, p).ToByteArray(); // little endian + (may be) zero last byte //remove last zero byte if (gb[gb.Length - 1] == 0x00) { gb = gb.SubArray(0, gb.Length - 1); } var length = gb.Length; var result = new byte[length]; for (int i = 0; i < length; i++) { result[length - i - 1] = gb[i]; } return(result); }