Пример #1
0
        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));
        }
Пример #2
0
        public static string EncodeWithCheck(byte[] plaintext)
        {
            ContractsCommon.NotNull(plaintext, "plaintext");
            ContractsCommon.ResultIsNonNull <string>();

            return(EncodeWithCheck(new byte[0], plaintext));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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));
        }
Пример #5
0
        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);
        }