yEnc是一种在二进制新闻组中广泛使用的编码方法,尽管它并非官方标准,但其简单性和高效性使其成为事实上的标准。yEnc使用8位字符来编码二进制数据,由于二进制数据通常以8位字节存储,因此这种编码方式不需要进行复杂的转换。
yEnc之所以流行,是因为它使用完整的字节来编码数据,而其他方法只使用7位。这使得使用yEnc编码的消息体积减小了33-40%,这对于上传和下载大型二进制文件来说非常重要。此外,yEnc还提供了可选的CRC32校验功能,进一步提高了数据传输的可靠性。
yEnc实现有两大特点:
新闻组消息有一些特殊性:
当前的yEnc算法默认转义了回车(CR)、换行(LF)和空字符(NULL)。然而,各个编码器可以自由地转义其他字符。按照惯例,行被分割成128个字符或256个字符,也支持其他行长。
yEnc数据以一行开始,该行以=ybegin标签开头。该标签具有额外的属性,指定了预期的字节数,以及文件名和行的长度。支持多部分消息。数据以一行以=yend开头结束。"=y"的原因是因为,由于算法的性质,它永远不会自然地作为数据的一部分出现。
算法实现纯粹处理数据的编码和解码,不涉及消息的解析,甚至不涉及解析yEnc的头部和尾部。对来说,这是另一个挑战,将留给其他人。
最初,将编码器编码为System.Text.Encoder的实现。但很快就意识到,尽管可以将数据作为文本读取,但实际上处理的是字节。这应该从一开始就很明显,但有时需要一段时间才能意识到。最终,决定它最好作为ICryptoTransform的实现。这并不是说它是一个密码学算法,只是它以类似的方式转换数据——输入数据的大小不一定与输出数据的大小匹配。微软选择以类似的方式实现Base64转换对象。
好处是可以与CryptoStream对象一起使用这些对象,这是一个相当容易使用的接口,并且自动添加了对流的支持。再次强调,这不是一种加密技术——只是利用现有的框架对象和接口来增强对象的能力。
C# MemoryStream ms = new MemoryStream();
// this could be any stream we want to write to
YEncEncoder encoder = new YEncEncoder();
CryptoStream cs = new CryptoStream(ms, encoder, CryptoStreamMode.Write);
StreamWriter w = new StreamWriter(cs);
w.Write("Test string");
// make sure everything is written out
w.Flush();
cs.Flush();
C# // reading back from the memorystream
ms.Position = 0;
YEncDecoder decoder = new YEncDecoder();
CryptoStream cs2 = new CryptoStream(ms, decoder, CryptoStreamMode.Read);
StreamReader r = new StreamReader(cs2);
string finalText = r.ReadToEnd();
这是可能编写的标准代码,如果正在加密数据,唯一的区别是使用的是yEncEncoder和yEncDecoder,而不是系统提供的加密算法。