예제 #1
0
        public static string Generate(RNGCryptoServiceProvider provider, int entropy)
        {
            var pswBytes = new byte[entropy];

            provider.GetBytes(pswBytes);

            var encoder = new Base85(Base85Alphabet.Ascii85);

            return(encoder.Encode(pswBytes));
        }
예제 #2
0
        public string Generate(int entropy)
        {
            var pswBytes = new byte[entropy];

            _rngCsp.GetBytes(pswBytes);

            var encoder = new Base85(Base85Alphabet.Ascii85);

            return(encoder.Encode(pswBytes));
        }
예제 #3
0
        public void TestBase85()
        {
            // Encode
            string test = StringHelper.RandomString(100_000);
            ReadOnlySpan <char> encoded = Base85.Encode(Encoding.UTF8.GetBytes(test), 0, test.Length);

            //Console.WriteLine(encoded.ToString());
            // Decode
            byte[] decoded = Base85.Decode(encoded, 0, encoded.Length).ToArray();
            //Console.WriteLine(Encoding.UTF8.GetString(decoded));
            Assert.AreEqual(test, decoded);

            Assert.Pass();
        }
 public static Func <object, string> GetSerializer(Type primitiveType)
 {
     if (generatedSerializers.TryGetValue(primitiveType.GUID, out var func))
     {
         return(func);
     }
     if (primitiveType == typeof(string))
     {
         func = x => (string)x;
     }
     else if (primitiveType == typeof(DateTime))
     {
         func = x => ((DateTime)x).Ticks.ToString();
     }
     //use fixed format provider to avoid ',' as decimal separator, it is used as delimiter for array elements.
     else if (primitiveType == typeof(double))
     {
         func = x => ((double)x).ToString("R", System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
     }
     else if (primitiveType == typeof(float))
     {
         func = x => ((float)x).ToString("R", System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
     }
     //compress space for integer arrays by using a base 85 encoding instead of base 10.
     else if (primitiveType == typeof(sbyte) || primitiveType == typeof(byte) ||
              primitiveType == typeof(short) || primitiveType == typeof(ushort) ||
              primitiveType == typeof(int))
     {
         func = x => Base85.Encode(Convert.ToInt32(x));
     }
     else if (primitiveType == typeof(uint) ||
              primitiveType == typeof(long))
     {
         func = x => Base85.Encode(Convert.ToInt64(x));
     }
     else
     {
         throw new InvalidOperationException();
     }
     generatedSerializers.AddOrUpdate(primitiveType.GUID, func, (guid, s) => func);
     return(func);
 }
 public static Func <string, object> GetDeserializer(Type primitiveType)
 {
     if (generatedDeserializers.TryGetValue(primitiveType.GUID, out var func))
     {
         return(func);
     }
     if (primitiveType == typeof(string))
     {
         func = x => x;
     }
     else if (primitiveType == typeof(DateTime))
     {
         func = x => new DateTime(Int64.Parse(x));
     }
     else if (primitiveType == typeof(double))
     {
         func = x => Double.Parse(x, System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
     }
     else if (primitiveType == typeof(float))
     {
         func = x => Single.Parse(x, System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
     }
     else if (primitiveType == typeof(sbyte) || primitiveType == typeof(byte) ||
              primitiveType == typeof(short) || primitiveType == typeof(ushort) ||
              primitiveType == typeof(int))
     {
         func = x => Convert.ChangeType(Base85.DecodeInt32(x), primitiveType);
     }
     else if (primitiveType == typeof(uint) ||
              primitiveType == typeof(long))
     {
         func = x => Convert.ChangeType(Base85.DecodeInt64(x), primitiveType);
     }
     else
     {
         throw new InvalidOperationException();
     }
     generatedDeserializers.AddOrUpdate(primitiveType.GUID, func, (guid, s) => func);
     return(func);
 }
예제 #6
0
 public void SetUp()
 {
     Converter = new Base85();
 }
        public void TestDecode()
        {
            string decoded = Encoding.UTF8.GetString(Base85.Decode(ENCODED_TEXT));

            Assert.True(decoded.Equals(PLAIN_TEXT), "Decoded value is not the same as the expected.");
        }
        public void TestEncode()
        {
            string encoded = Base85.Encode(Encoding.UTF8.GetBytes(PLAIN_TEXT));

            Assert.True(encoded.Equals(ENCODED_TEXT), "Encoded value is not the same as the expected.");
        }
예제 #9
0
        public static DescrambledMessage Decode(string scrambledString, bool recursive, MdbReader reader)
        {
            if (reader == null)
            {
                reader = new MdbReader();
            }

            if (scrambledString.Length < 2)
            {
                throw new Exception("Invalid message length!");
            }

            if (!scrambledString.StartsWith("~"))
            {
                throw new Exception("Invalid message start! Expecting: ~");
            }

            if (!scrambledString.EndsWith("~") && !recursive)
            {
                throw new Exception("Invalid message end! Expecting: ~");
            }

            scrambledString = scrambledString.Substring(1);
            if (!recursive)
            {
                scrambledString = scrambledString.Substring(0, scrambledString.Length - 1);
            }

            DescrambledMessage aoDescrambledMessage = new DescrambledMessage(0, 0, null);
            MemoryStream       stream = new MemoryStream(Encoding.UTF8.GetBytes(scrambledString));

            while (true)
            {
                if (stream.Position >= stream.Length)
                {
                    break;
                }

                //string type = char.ConvertFromUtf32(stream.ReadByte()); /* Not Supported on Mono */
                string type = Convert.ToChar(stream.ReadByte()).ToString();
                switch (type)
                {
                case "&":     // Message start, Category ID and Entry ID
                    aoDescrambledMessage = new DescrambledMessage(
                        Base85.Decode(Read(stream, 5)),
                        Base85.Decode(Read(stream, 5)),
                        "~" + scrambledString + "~"
                        );
                    break;

                case "s":     // String
                    Int32  textSize = stream.ReadByte();
                    String text     = Read(stream, textSize - 1);
                    aoDescrambledMessage.Append(new DescrambledArgument(text));
                    break;

                case "i":     // Integer
                    Int32 integer = Base85.Decode(Read(stream, 5));
                    aoDescrambledMessage.Append(new DescrambledArgument(integer));
                    break;

                case "u":     // Unsigned Integer
                    UInt32 unsignedInteger = (UInt32)Base85.Decode(Read(stream, 5));
                    aoDescrambledMessage.Append(new DescrambledArgument(unsignedInteger));
                    break;

                case "f":     // Float
                    Single single = (Single)Base85.Decode(Read(stream, 5));
                    aoDescrambledMessage.Append(new DescrambledArgument(single));
                    break;

                case "R":     // Reference, Category ID and Entry ID
                    String referenceMessage    = string.Empty;
                    Int32  referenceCategoryID = Base85.Decode(Read(stream, 5));
                    Int32  referenceEntryID    = Base85.Decode(Read(stream, 5));
                    if (reader != null)
                    {
                        MdbEntry referenceEntry = reader.GetEntry(referenceCategoryID, referenceEntryID);
                        if (referenceEntry != null)
                        {
                            referenceMessage = referenceEntry.Message;
                        }
                    }
                    DescrambledArgument reference = new DescrambledArgument(
                        referenceCategoryID,
                        referenceEntryID,
                        referenceMessage
                        );
                    aoDescrambledMessage.Append(reference);
                    break;

                case "F":     // Recursive, Complete new message
                    Int32  recursiveSize = stream.ReadByte();
                    String recursiveText = Read(stream, recursiveSize - 1);
                    aoDescrambledMessage.Append(new DescrambledArgument(Decode(recursiveText, true, reader)));
                    break;

                default:
                    throw new Exception("Unknown type detected: " + type);
                }
            }
            if (reader != null)
            {
                MdbEntry entry = reader.GetEntry(aoDescrambledMessage.CategoryID, aoDescrambledMessage.EntryID);
                if (entry != null)
                {
                    try { aoDescrambledMessage.Message = String.Format(PrintfToFormatString(entry.Message), aoDescrambledMessage.Arguments); }
                    catch { }
                }
            }
            return(aoDescrambledMessage);
        }
예제 #10
0
 private Base GetMethod()
 {
     Base method = null;
     string alphabet = tbAlphabet.Text;
     if (tbSpecialChar.Text.Length > 1)
         throw new ArgumentException("Special char should contains one symbol");
     char special = string.IsNullOrWhiteSpace(tbSpecialChar.Text) ? (char)0 : tbSpecialChar.Text[0];
     Encoding textEncoding = cmbTextEncoding.SelectedItem != null ?
         (Encoding)((ComboBoxItem)cmbTextEncoding.SelectedItem).Value : null;
     bool parallel = cbParallel.Checked;
     switch (cmbMethod.SelectedItem.ToString())
     {
         case "Base32":
             method = new Base32(alphabet, special, textEncoding);
             break;
         case "Base64":
             method = new Base64(alphabet, special, textEncoding, parallel);
             break;
         case "Base128":
             method = new Base128(alphabet, special, textEncoding);
             break;
         case "Base256":
             method = new Base256(alphabet, special, textEncoding);
             break;
         case "Base1024":
             method = new Base1024(alphabet, special, textEncoding);
             break;
         case "Base4096":
             method = new Base4096(alphabet, special, textEncoding);
             break;
         case "ZBase32":
             method = new ZBase32(alphabet, special, textEncoding);
             break;
         case "Base85":
             method = new Base85(alphabet, special, cbPrefixPostfix.Checked, textEncoding);
             break;
         case "Base91":
             method = new Base91(alphabet, special, textEncoding);
             break;
         case "BaseN":
             method = new BaseN(alphabet, (uint)nudMaxBitsCount.Value, textEncoding, cbReverseOrder.Checked, parallel);
             break;
         case "BaseBigN":
             method = new BaseBigN(alphabet, (uint)nudMaxBitsCount.Value, textEncoding,
                 cbReverseOrder.Checked, parallel, cbMaxCompression.Checked);
             break;
     }
     tbBitsPerChars.Text = method.BlockBitsCount + "/" + method.BlockCharsCount;
     tbRatio.Text = ((double)method.BlockBitsCount / method.BlockCharsCount).ToString("0.000000");
     nudAlphabetLength.Value = method.CharsCount;
     return method;
 }
예제 #11
0
 public void SetUp()
 {
     Converter = new Base85();
 }
예제 #12
0
        private Base GetMethod()
        {
            Base   method   = null;
            string alphabet = tbAlphabet.Text;

            if (tbSpecialChar.Text.Length > 1)
            {
                throw new ArgumentException("Special char should contains one symbol");
            }
            char     special      = string.IsNullOrWhiteSpace(tbSpecialChar.Text) ? (char)0 : tbSpecialChar.Text[0];
            Encoding textEncoding = cmbTextEncoding.SelectedItem != null ?
                                    (Encoding)((ComboBoxItem)cmbTextEncoding.SelectedItem).Value : null;
            bool parallel = cbParallel.Checked;

            switch (cmbMethod.SelectedItem.ToString())
            {
            case "Base32":
                method = new Base32(alphabet, special, textEncoding);
                break;

            case "Base64":
                method = new Base64(alphabet, special, textEncoding, parallel);
                break;

            case "Base128":
                method = new Base128(alphabet, special, textEncoding);
                break;

            case "Base256":
                method = new Base256(alphabet, special, textEncoding);
                break;

            case "Base1024":
                method = new Base1024(alphabet, special, textEncoding);
                break;

            case "Base4096":
                method = new Base4096(alphabet, special, textEncoding);
                break;

            case "ZBase32":
                method = new ZBase32(alphabet, special, textEncoding);
                break;

            case "Base85":
                method = new Base85(alphabet, special, cbPrefixPostfix.Checked, textEncoding);
                break;

            case "Base91":
                method = new Base91(alphabet, special, textEncoding);
                break;

            case "BaseN":
                method = new BaseN(alphabet, (uint)nudMaxBitsCount.Value, textEncoding, cbReverseOrder.Checked, parallel);
                break;

            case "BaseBigN":
                method = new BaseBigN(alphabet, (uint)nudMaxBitsCount.Value, textEncoding,
                                      cbReverseOrder.Checked, parallel, cbMaxCompression.Checked);
                break;
            }
            tbBitsPerChars.Text     = method.BlockBitsCount + "/" + method.BlockCharsCount;
            tbRatio.Text            = ((double)method.BlockBitsCount / method.BlockCharsCount).ToString("0.000000");
            nudAlphabetLength.Value = method.CharsCount;
            return(method);
        }