private static byte[] DecodeBase64Check(string base64encoded) { // TODO logic copied from Base58.decodeChecked -> can this be reused // here? Base64Encoder enc = new Base64Encoder(); byte[] decoded = enc.DecodeData(base64encoded); if (decoded.Length < 4) { throw new FormatException("Input too short"); } byte[] data = new byte[decoded.Length - 4]; byte[] checksum = new byte[4]; Buffer.BlockCopy(decoded, 0, data, 0, data.Length); Buffer.BlockCopy(decoded, data.Length, checksum, 0, 4); SHA256Managed m = new SHA256Managed(); byte[] re = m.ComputeHash(data); re = m.ComputeHash(re); byte[] actualChecksum = new byte[4]; Buffer.BlockCopy(re, 0, actualChecksum, 0, 4); if (!Enumerable.SequenceEqual(checksum, actualChecksum)) { throw new FormatException("Checksum does not validate"); } return(data); }
private static string EncodeBase64Check(byte[] input) { SHA256Managed m = new SHA256Managed(); byte[] re = m.ComputeHash(input); re = m.ComputeHash(re); byte[] checksum = new byte[4]; Buffer.BlockCopy(re, 0, checksum, 0, 4); byte[] base64checksum = input.Concatenate(checksum); Base64Encoder enc = new Base64Encoder(); return(enc.EncodeData(base64checksum)); }