admin 管理员组文章数量: 1184232
2024年4月29日发(作者:楞严咒回向偈全文)
第27卷第4期
内蒙古民族大学学报(自然科学版)
Vol_27 No.4
2012年7月
Journal of Inner Mongolia University for Nationalities
Ju1.2012
基于6进制的信息编码与解码算法
额尔敦必力格 ,张莫日根。
(1.内蒙古民族大学网络中心,内蒙古通辽028000;2.上海交通大学物理系08届毕业生,上海201101)
(摘 要]编程人员常常需要通过再编码将信息显示为一种不可识别的形式.比如著名的Base64编码技术就是
通过对E—mail原文的再编码,使网络上传输的是一堆不可直接识别原意的“乱码”,从而实现了信息隐藏.所不
同的是本文提出并构建了另一种36个码元构成码元集,其中只使用了0到9的数字和26个大写拉丁字母,并在
此基础上实现了完整的编码与解码算法,最后提出了对该算法进一步加以扩展的大体思路.
[关键词]码元集;编码;解码;算法
[中图分类号]TP399 [文献标识码]A [文章编号]1671—0185(20l2)04—04l4—03
An Algorithm Of Encoding And Decoding In Base 6
Erdenbilig ,Morgan
(1.The Center of Networks,Inner Mongolia University ofr Nationalities,Tongliao 028000,China;
2.Shanghai Jiao Tong University,Shanghai 201101,China)
Abstract:Programmers often re-code the messages in order to make them can not recognized directly.Such as in
Base64,E-mall’S original text iS re—coded into”messy WOrds”which iS can not identiifed directly,thus the information
is hidden.Unlike the above,in this paper,an algorithm of encoding and decoding for a code set in base 6,in which 36
code elements(they are 0—9 digits and 26 capital lattin letters)are contained.And in the last the author suggest how to
extend this system to Unicode.
Key words:Code set;Encoding;Decoding;Algorithm
1 引言
在编程实践中常常需要通过再编码将信息显示为一种不可直接识别的形式,即所谓实现信息隐藏.在已知的著名编
码系统中有Base64编码技术,它使用52个大小写拉丁字母、0到9个数字码外加“+”和“一”两个字符共64个码元构成的码
元集.众所周知,该编码系统在E—mail的传输中得到了应用.本文旨在提供一种字符编码新算法,以实现36个码元构成的编
码方案.其特点是使用涵盖0到9个数字及26个大写拉丁字母构成一个含有36个码元构成的码元集.
2算法要点
(1)6进制码元集
内码、外码
O 00 1 01 2 02 3 03 4 04 5 05
6 10 7 11 8 12 9 13 A 14 B 15
C 20 D 21 E 22 F 23 G 24 H 25
●
I 30 J 3l K 32 L 33 M 34 N 35
0 40 P 41 Q 42 R 43 S 44 T 45
U 50 V 51 W 52 X 53 Y 54 Z 55
作者简介:额尔敦必力格,内蒙古民族大学网络中心副教授
第4期 额尔敦必力格等:基于6进制的信息编码与解码算法 415
从上表中可注意到用两位6进制码正好可把数字和大写拉丁字母包含进来.信息经过该码元集处理后,只能看到数字
和大写拉丁字母,从视觉效应上来讲不像Base64那样大小写混杂在一起,显得杂乱无序.比如字符串”Hello World!”经处理
后可随机输出为:”C392TK30K30K33K5F92FK33K36K30K2SK5L9”
(2)ASCII扩展字符集内的字符内码转换为6进制后有效位数从最小为1,到最大为4位,如0的6进制码为0,255的6
进制码位1103,所以为了处理方便,可用6位码长进行编码.这样做的目的是为了保留两位数的尾码,用于保存补位的位数.
比如6的6进制内码正好为10,占用两位.补位的策略是:有效位数不足6位者需要补足6位,并将所有补位除尾码占用外全
部都用6进制随机数加以填充,已达到信息加扰的目的.再次特别强调的是:6位码中补位的位数需要在尾码中显式给出,
以便在解码中将尾码中提示的补足位数加以去除,并分检出有效位用于解码.
3编码与解码
(1)构建码表
首先要将码表构建在字典中(当然也可考虑哈希表),其中字典EnCode为6进制内码转外码,字典DeCode为6进制外
码转内码,字典的定义如下:
Dietionary<int,char>EnCode=new Dictionary<int,char>();
Dictionary<char,int>DeCode=new Dictionary<char。int>();
构建码表的过程实际就是将O…9数字的内码和A…z字符的内码转换为6进制内码的过程.数字0…9对应内码为
48..;59,大写拉丁字母A…z对应内码为65…9O,由此可看出他们并不是连续分布的,所以该过程要分段进行.
构建码表算法如下:
for(int i=0;i<36;i++)DeCode.Add(Conve ̄.ToChar(i<10 7 nCharl:
{ nChar2),a+carry);
a=i%6;,/取得个位 if(i<10)nCharl++:
carry=(i/6) 10;,/取得6进制进位,并累加得6 else nChar2++;
进制数
,,6进制内码与外码互为访问键,保存到 a=O;
字典中 carry=0:
EnCode.Add(a+carry,Conve ̄.ToChar(i<10 7 1
nCharl:nChar2));
(2)编码算法
首先要将源信息串转换为6进制表达的内码,假设用str表示输入的信息串,经过转换得到用大数表示的6进制内码
BigInt.算法中的变量ic的初值为1000000,这是本编码系统的要点,因为要用6位6进制数表示源信息内码,所以每次要为
下一个源信息码预留出6位,然后用累加和的方式用低6位表示下一个6进制信息码.
请注意几个特殊的临界内码:比如0和255的内码需要单独处理,6的内码为6进制的1O,36的6进制内码为100,255
的6进制内码为1000,这样就构成了补位区间:0需要补足6位,区间1…5需要补足5位,区间6…35需要补足4位,区间
36…254需要补足3位,255需要补足2位.算法如下:
foreaeh(char ch in str)
(NewNum>=6&&NewNum<36)?2:
{
(NewNum>=36&&NewNum<216)?3:4:
a=b=ch;
while(b>o)//生成6进制内码
switch(nswitch)
{
{
a=a%6:
case0:
NewNum+=a =iCount;
NewNum =1000000;//确定补位位数
iCount =10;
forcnt=5;,,确定干扰位的位数
a=b/=6:
rearnum=0;//确定6进制码的尾码数
l
break;
,/考虑几个特殊的临界内码的处理
}
nswitch=(NewNum==0)?0:
,/然后根据forent变量所确定的干扰位数,再通过
(NewNum>0&&NewNum<6)?1:
循环生成干扰数将干扰位加以填充 .
416 内蒙古民族大学学报 2012焦
转换后的结果.先给出简化代码如下:
Bum =10;
while(b>0)
Bum+=rand.Next(0,5);
{
str+=EnCode[(a%=100).IntValue()].ToString
();/1:t ̄6进制内码转为对应的外码
a=b/=100;//分检出下一个两位6进制数
接下来需要进一步将得到的6进制内码转换为对应 l
的外码,这样就可以得到文中开头的字符串“Hello World!”
(3)解码算法
解码过程首先要将6进制外码转换为对应的内码.设输入一个6进制字符串str,输出一个6进制内码构成的大数
Biglnt.简化代码如下:
foreach(char chinStr)
nswitch==4 7 10o00:
{
nswitch==3 7 l0oO:
Biglnt+=DeCode[ch);//6进制外码转换为内码
nswiteh==2 7 100:1000000;
BigInt =1oo;//留出下一6进制内码位置
}
al=a2=a.IntValue();
再将6进制内码转换为源外码:
while(a2>0)
while(b>0)
{
{
,/还原为源码内码
,/每个源字符转换为6位6进制数不足6位者添加
al=(al%=10) iCount;
补足
Big+=al;
a%=1000000;11 ̄"离出6位,每6位6进制代表一
iCount =6:
个ASCII字符
al=a2,=10;
nswitch=(a%lO).IntValue();// ̄-离出有效位
}
a/=nswiteh==5 7 100(0 ̄:
以上算法经过10万次随机生成的字符串的测试通过.
4小结
通过以上算法分析可注意到每个源字符需要三个6进制码元来表达,这无论从空间开销,还是运算开销来讲都是得不
偿失的,好在本系统不是为大块信息的转换而设计,而是用于短信息的处理.众所周知,共享软件的盈利模式是通过用户有
偿注册实现的.目前较为普遍的作法就是获取用户的注册申请码,然后由软件作者对用户注册申请码进行再计算,将得到
的结果进行加密后再发回给用户完成注册.其中用户注册申请码一般都是与用户机器相关的,可以是主板序列号、硬盘序
列号、网卡物理地址、或者是它们的组合等,其中网卡物理地址是有结构的,很容易看出来.我们可以用上述编码系统对这
些信息进行打包处理,这样发给软件作者前用户看到的是打包后的信息,从而达到信息隐藏这一目的.
本系统设计的初衷是用于处理ASCII扩展字符集,但稍加改动即可扩展至更宽域内的字符集,比如Unicode字符集,汉
字字码正好包含在其中.Unicode字符集码元只比ASCII扩展字符集多出一个字节,所以第一只需将本系统的6个码长为一
组改为l2个码长为一组.第二需要适当改动加扰位并标记加扰位位数.第三是需要将汉字的内码转为6进制表达即可完成
扩展.
本系统是用c#开发的,其与C代码相近,很容易移植到C++中,这样就可以编译成机器代码并用动态链接库的形式固
定下来.一方面使代码的安全性提高一个档次,另一方面还可以在其它语言平台中调用之.
参考文 献
[1]于应刚.巧用Base64编码和GUID实现数据加密[J].电脑编程技巧与维护,2009,12:56—58.
[2]Base64编码解码与实现[url:http://www.diyb1.com/course/3_program/c/c._js/20090914/175100.htm1]
[3]中文字符集与字符编码的基础知识[url:http://www.blogjava.net/sparldarchive/2006/09/29/72748.htm1]
(责任编辑郑瑛)
版权声明:本文标题:基于6进制的信息编码与解码算法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714389768a678099.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论