public static string Encode(byte[] plaintext) { ContractsCommon.NotNull(plaintext, "plaintext"); ContractsCommon.ResultIsNonNull <string>(); var plaintextArr = new byte[plaintext.Length + 1]; Array.Copy(plaintext, 0, plaintextArr, 1, plaintext.Length); Array.Reverse(plaintextArr); var workingValue = new BigInteger(plaintextArr); StringBuilder sb = new StringBuilder(plaintext.Length * 138 / 100 + 1); while (workingValue.CompareTo(BigInteger.Zero) > 0) { BigInteger remainder; workingValue = BigInteger.DivRem(workingValue, Base, out remainder); sb.Append(Alphabet[(int)remainder]); } Contract.Assert(workingValue.Sign >= 0); //sb.Insert(0, Alphabet[(int)workingValue]); for (int i = 0; i < plaintext.Length && plaintext[i] == 0; ++i) { sb.Append(Alphabet[0]); } var retVal = new char[sb.Length]; sb.CopyTo(0, retVal, 0, sb.Length); Array.Reverse(retVal); return(new string(retVal)); }
public static string EncodeWithCheck(byte[] plaintext) { ContractsCommon.NotNull(plaintext, "plaintext"); ContractsCommon.ResultIsNonNull <string>(); return(EncodeWithCheck(new byte[0], plaintext)); }
public static byte[] ToBytesArrayBE(this BigInteger bi) { ContractsCommon.ResultIsNonNull <byte[]>(); Contract.Ensures(Contract.Result <byte[]>().Length == bi.ToByteArray().Length); var resultArray = bi.ToByteArray(); Array.Reverse(resultArray); return(resultArray); }
public static string EncodeWithCheck(byte[] prefix, byte[] plaintext) { ContractsCommon.NotNull(prefix, "prefix"); ContractsCommon.NotNull(plaintext, "plaintext"); ContractsCommon.ResultIsNonNull <string>(); var plaintextArr = (byte[])plaintext.Clone(); var hash = Cryptography.CryptoFunctionProviderFactory.Default.Hash256(plaintextArr, prefix); var plaintextExtended = new byte[plaintext.Length + prefix.Length + 4]; Array.Copy(plaintext, 0, plaintextExtended, 0, plaintext.Length); Array.Copy(prefix, 0, plaintextExtended, plaintext.Length, prefix.Length); Array.Copy(hash.Bytes, 0, plaintextExtended, prefix.Length + plaintext.Length, 4); return(Encode(plaintextExtended)); }
public static byte[] Decode(string enc) { ContractsCommon.NotNull(enc, "enc"); Contract.Requires <FormatException>(Contract.ForAll(0, enc.Length, i => Alphabet.IndexOf(enc[i]) != -1)); ContractsCommon.ResultIsNonNull <byte[]>(); if (enc.Length == 0) { return(new byte[0]); } var workingValue = BigInteger.Zero; for (int i = 0; i < enc.Length; ++i) { var index = new BigInteger(Alphabet.IndexOf(enc[i])); workingValue = workingValue + index * BigInteger.Pow(Base, enc.Length - 1 - i); } var retVal = workingValue.ToByteArray(); Array.Reverse(retVal); if (retVal[0] == 0 && workingValue > 0) { var newBytes = new byte[retVal.Length - 1]; Array.Copy(retVal, 1, newBytes, 0, newBytes.Length); retVal = newBytes; } var count = 0; while (enc[count] == Alphabet[0]) { ++count; } if (count > 0) { var newBytes = new byte[retVal.Length + count]; Array.Copy(retVal, 0, newBytes, count, retVal.Length); retVal = newBytes; } return(retVal); }