Зашифрованный и сжатый алгоритм без потерь, содержащий только буквы и цифры

У меня есть бизнес-приложение, которое требует, чтобы пользователи отправляли информацию на сервер с помощью мобильного телефона. Пользователи не всегда будут иметь доступ к Интернету, поэтому я заставляю их отправлять информацию через текстовые сообщения.

Сначала немного информации о текстах:

Одно текстовое сообщение может содержать только 160 символов.

Текстовые сообщения имеют очень ограниченный набор символов. Вы можете посмотреть набор здесь. Согласно сайту, могут использоваться дополнительные символы, но они занимают больше места, и я не уверен, что все телефоны поддерживают это.

Это приложение предназначено для тестирования, которое проходят пользователи, поэтому крайне важно, чтобы они не выяснили, как обманывать систему, и сами отправляли сообщения о том, что они прошли тест.

Теперь необходимо будет передавать информацию, поэтому любой алгоритм должен быть без потерь. Можно использовать простой метод шифрования, если пользователь не может легко (и я имею в виду очень легко) преобразовать его. Люди, использующие это, не очень разбираются в технологиях, но кто-то может выяснить, если я просто конвертирую это в base 64.

Я искал повсюду алгоритм, но все, что я нашел, создают результаты, которые либо слишком длинны, либо имеют символы вне диапазона, разрешенного текстом.

Поэтому мой вопрос заключается в том, знает ли кто-нибудь о таком алгоритме и, если да, знает, сколько информации я могу отправить, используя его.

1 ответ

Новый пост:

Это то, что я в конечном итоге использовал. Я думаю, что одного алгоритма сжатия достаточно для шифрования людей, которые будут использовать приложение. Я изучил класс Crypto в C# и попытался реализовать его, но не смог заставить его работать, поэтому сейчас я буду придерживаться этого и добавлять дополнительную безопасность по мере необходимости. В качестве бонуса я могу получить более 7000 символов информации в тексте из 120 символов.

public static string Compress(string uncompressedString)
    {
        byte[] compressArray = null;
        var data = Encoding.UTF8.GetBytes(uncompressedString);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (DeflateStream deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress))
            {
                deflateStream.Write(data, 0, data.Length);                    
            }
            compressArray = memoryStream.ToArray();
        }

        return Convert.ToBase64String(compressArray); ;
    }

    public static string Decompress(string compressedString)
    {
        byte[] decompressedArray = null;
        var data = Convert.FromBase64String(compressedString);
        using (MemoryStream decompressedStream = new MemoryStream())
        {
            using (MemoryStream compressStream = new MemoryStream(data))
            {
                using (DeflateStream deflateStream = new DeflateStream(compressStream, CompressionMode.Decompress))
                {
                    deflateStream.CopyTo(decompressedStream);
                }
            }
            decompressedArray = decompressedStream.ToArray();
        }

        return Encoding.UTF8.GetString(decompressedArray);
    }

Старый пост:

Это лучшее, что я смог придумать. Я могу отправить около 85 символов информации в 100-буквенном текстовом сообщении.

var info = "Information to send";

info = EncryptDecrypt(info, 12878);

var codes = "";
var utf8 = System.Text.Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(info);
foreach (byte b in utfBytes)
{
    codes += b.ToString() + ",";
}

info = codes;
info = Compress(info);

EncryptDecrypt:

    public static string EncryptDecrypt(string szPlainText, int szEncryptionKey)
    {
        StringBuilder szInputStringBuild = new StringBuilder(szPlainText);
        StringBuilder szOutStringBuild = new StringBuilder(szPlainText.Length);
        char Textch;
        for (int iCount = 0; iCount < szPlainText.Length; iCount++)
        {
            Textch = szInputStringBuild[iCount];
            Textch = (char)(Textch ^ szEncryptionKey);
            szOutStringBuild.Append(Textch);
        }
        return szOutStringBuild.ToString();
    }

Компресс:

    public static string Compress(string uncompressedString)
    {
        byte[] compressedBytes;

        using (var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(uncompressedString)))
        {
            var compressedStream = new MemoryStream();

            using (var compressorStream = new DeflateStream(compressedStream, CompressionLevel.Fastest, true))
            {
                uncompressedStream.CopyTo(compressorStream);
            }

            compressedBytes = compressedStream.ToArray();
        }

        return Convert.ToBase64String(compressedBytes);
    }

Затем эту операцию можно повернуть вспять, чтобы получить исходную строку, разделив запятую, чтобы получить байт []. По крайней мере, я думаю, что это будет работать.

Другие вопросы по тегам