俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

【原创】一种将文本编码为图片格式的方法

世界上的文字可以被四个字节完全覆盖,也就是UTF-32,其他都是变长的格式。而恰好ARGB加起来四个字节,于是完全可以把一个字符映射为一个像素点嘛!

RSA解密异常,求大神指点
public string Encryption(string strKey) { CspParameters param = new CspParameters(); param.KeyContainerName = "Rich_CRM";//密匙容器的名称,保持加密解密一致才能解密成功 using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider { byte[] plaindata = Encoding.Default.GetBytes;//将要加密的字符串转换为字节数组 byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组 return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串 } } //解密 public string Decrypt(string ciphertext) { CspParameters param = new CspParameters(); param.KeyContainerName = "Rich_CRM"; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider { byte[] encryptdata = Convert.FromBase64String(ciphertext); byte俄罗斯贵宾会,[] decryptdata = rsa.Decrypt(encryptdata, true); return Encoding.Default.GetString(decryptdata); } } 同样的代码,用winform测试都是可以的,但是写webservice的时候,解密执行到byte[] decryptdata = rsa.Decrypt(encryptdata, true);会有问题,没有报错,直接跳出去了,这是为什么?求大神指点

并且图片上的字节可以再次加密,非常好玩!我仅演示的超级无敌简单的取反操作。

 

我自己习惯看方形的图片,于是开平方取整,如果字符数量不足就从字符本身随机取一段,这是为了图片尾部不会几个像素留白,炒鸡不美观,以白色(0xFFFFFFFF)作为终止字符。

static Bitmap ArgbTextEncode(string input)
        {
            var x = 0;
            var y = 0;
            var lenth = input.Length;
            var yValue = (int)(Math.Sqrt(input.Length) + 1);
            var fill = (yValue * yValue) % (Encoding.Unicode.GetByteCount(input) / 4);
            input += input.Substring(Rnd.random.Next(input.Length - fill - 1), fill);
            var image = new Bitmap(yValue, yValue);

            //fill
            for (int i = 0; i < yValue * yValue; i++)
            {
                if (i == lenth - 1)
                {
                    image.SetPixel(x, y, Color.White);
                }
                else
                {
                    byte[] bytes = Encoding.Unicode.GetBytes(input[i].ToString());
                    var prefix = 4 - bytes.Length;
                    bytes = Enumerable.Repeat<byte>(0, prefix).Concat(bytes).ToArray();
                    Encrypt(bytes);
                    image.SetPixel(x, y, Color.FromArgb(bytes[0], bytes[1], bytes[2], bytes[3]));
                }
                //Console.WriteLine("{0},{1} = {2}", x, y, input[i]);
                x++;
                if (x % yValue == 0)
                {
                    x = 0;
                    y++;
                }
            }
            return image;
        }

  

找了一个日志文本,看看效果

俄罗斯贵宾会 1

 

 

解码函数

 

static string DecodeTextFromArgb(Bitmap image)
        {
            //ComplexImage comp = ComplexImage.FromBitmap(image);
            //comp.BackwardFourierTransform();
            var str = "";
            for (int i = 0; i < image.Height; i++)
            {
                for (int j = 0; j < image.Width; j++)
                {
                    var color = image.GetPixel(j, i);
                    if (color.A == 255 && color.R == 255 && color.G == 255 && color.B == 255)
                        return str;
                    var bytes = new byte[] { color.A, color.R, color.G, color.B };
                    Decrypt(bytes);
                    int skip = 0;
                    if (bytes[0] == 0)
                    {
                        if (bytes[1] == 0)
                        {
                            skip = 2;
                        }
                        else
                        {
                            skip = 1;
                        }
                    }
                    else
                    {
                        skip = 0;
                    }
                    var t = Encoding.Unicode.GetString(bytes.Skip(skip).ToArray());
                    //Console.WriteLine("{0},{1} = {2}", j, i, t);
                    str += t;
                }
            }
            return str;
        }

本文由俄罗斯贵宾会发布于编程,转载请注明出处:【原创】一种将文本编码为图片格式的方法

您可能还会对下面的文章感兴趣: