仅包含字母数字的无损加密和压缩算法

时间:2019-02-14 16:28:53

标签: c# lossless-compression

我有一个商务应用程序,需要用户使用手机将信息发送到服务器。用户并非总是可以访问Internet,所以我让他们通过文本消息发送信息。

首先,有关文本的一些信息:

一条短信只能包含160个字符。

文本消息的字符集非常有限。您可以查看集合here。根据该站点的说法,可以使用其他字符,但是它们占用更多空间,我不确定是否所有电话都支持它。

此应用程序用于用户进行的测试,因此他们必须不弄清楚如何复制系统并自己发送表明已通过测试的消息。

现在,信息将需要中继,因此任何算法都将是无损的。只要用户不能轻松地(我的意思是很容易)转换它,就可以使用一种简单的加密方法。使用此工具的人不是很精通技术,但是有人会弄清楚我是否只是将其转换为base 64。

我到处都在寻找一种算法,但是我发现所有算法都会导致结果太长或字符超出文本允许的范围。

所以我的问题是,是否有人知道这种算法,如果知道,我可以使用该算法发送多少信息。

1 个答案:

答案 0 :(得分:0)

新帖子:

这是我最终使用的。我认为对于要使用该应用程序的人来说,仅压缩算法就足够了。我研究了C#的Crypto类并尝试实现它,但是我无法使其正常工作,因此我现在将坚持这一点并根据需要添加进一步的安全性。作为奖励,我可以在120个字符的文本中获得7000多个字符的信息。

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);
    }

旧帖子:

这是我能想到的最好的方法。我可以通过100个字母的短信发送大约85个字符的信息。

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);
    }

然后可以反转操作以获取原始字符串,以逗号分隔以获取字节[]。至少我认为这会起作用。