1. 常用数据校验方法有哪些
奇偶校验”。内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、 1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc 发明,由 MD2/MD3/MD4 发展而来的。MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被“篡改”。举个例子,天天安全网提供下载的MD5校验值软件WinMD5.zip,其MD5值是,但你下载该软件后计算MD5 发现其值却是,那说明该ZIP已经被他人修改过,那还用不用该软件那你可自己琢磨着看啦。
MD5广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,来验证该用户的合法性。
MD5校验值软件WinMD5.zip汉化版,使用极其简单,运行该软件后,把需要计算MD5值的文件用鼠标拖到正在处理的框里边,下面将直接显示其MD5值以及所测试的文件名称,可以保留多个文件测试的MD5值,选定所需要复制的MD5值,用CTRL+C就可以复制到其它地方了。
参考资料:http://..com/question/3933661.html
CRC算法原理及C语言实现 -来自(我爱单片机)
摘 要 本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控制器硬件环境的C语言程序。读者更能根据本算法原理,用不同的语言编写出独特风格更加实用的CRC计算程序。
关键词 CRC 算法 C语言
1 引言
循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。
这里将提供三种算法,它们稍有不同,一种适用于程序空间十分苛刻但CRC计算速度要求不高的微控制器系统,另一种适用于程序空间较大且CRC计算速度要求较高的计算机或微控制器系统,最后一种是适用于程序空间不太大,且CRC计算速度又不可以太慢的微控制器系统。
2 CRC简介
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以 )后,再除以一个多项式,最后所得到的余数既是CRC码,如式(2-1)式所示,其中B(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
(2-1)
求CRC 码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码。本文不讨论32位的CRC算法,有兴趣的朋友可以根据本文的思路自己去推导计算方法。
CRC-16:(美国二进制同步系统中采用)
CRC-CCITT:(由欧洲CCITT推荐)
CRC-32:
接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
3 按位计算CRC
对于一个二进制序列数可以表示为式(3-1):
(3-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(3-2)所示:
(3-2)
可以设: (3-3)
其中 为整数, 为16位二进制余数。将式(3-3)代入式(3-2)得:
(3-4)
再设: (3-5)
其中 为整数, 为16位二进制余数,将式(3-5)代入式(3-4),如上类推,最后得到:
(3-6)
根据CRC的定义,很显然,十六位二进制数 既是我们要求的CRC码。
式(3 -5)是编程计算CRC的关键,它说明计算本位后的CRC码等于上一位CRC码乘以2后除以多项式,所得的余数再加上本位值除以多项式所得的余数。由此不难理解下面求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,0x1021与多项式有关。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
[code]
按位计算CRC虽然代码简单,所占用的内存比较少,但其最大的缺点就是一位一位地计算会占用很多的处理器处理时间,尤其在高速通讯的场合,这个缺点更是不可容忍。因此下面再介绍一种按字节查表快速计算CRC的方法。
4 按字节计算CRC
不难理解,对于一个二进制序列数可以按字节表示为式(4-1),其中 为一个字节(共8位)。
(4-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(4-2)所示:
(4-2)
可以设: (4-3)
其中 为整数, 为16位二进制余数。将式(4-3)代入式(4-2)得:
(4-4)
因为:
(4-5)
其中 是 的高八位, 是 的低八位。将式(4-5)代入式(4-4),经整理后得:
(4-6)
再设: (4-7)
其中 为整数, 为16位二进制余数。将式(4-7)代入式(4-6),如上类推,最后得:
(4-
很显然,十六位二进制数 既是我们要求的CRC码。
式(4 -7)是编写按字节计算CRC程序的关键,它说明计算本字节后的CRC码等于上一字节余式CRC码的低8位左移8位后,再加上上一字节CRC右移8位(也既取高8位)和本字节之和后所求得的CRC码,如果我们把8位二进制序列数的CRC全部计算出来,放如一个表里,采用查表法,可以大大提高计算速度。由此不难理解下面按字节求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,CRC余式表是按0x11021多项式求出的。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二进制数的形式暂存CRC的高8位 */
crc<<=8; /* 左移8位,相当于CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和当前字节相加后再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
很显然,按字节求CRC时,由于采用了查表法,大大提高了计算速度。但对于广泛运用的8位微处理器,代码空间有限,对于要求256个CRC余式表(共512字节的内存)已经显得捉襟见肘了,但CRC的计算速度又不可以太慢,因此再介绍下面一种按半字节求CRC的算法。
5 按半字节计算CRC
同样道理,对于一个二进制序列数可以按字节表示为式(5-1),其中 为半个字节(共4位)。
(5-1)
求此二进制序列数的CRC码时,先乘以 后(既左移16位),再除以多项式G(X),所得的余数既是所要求的CRC码。如式(4-2)所示:
(5-2)
可以设: (5-3)
其中 为整数, 为16位二进制余数。将式(5-3)代入式(5-2)得:
(5-4)
因为:
(5-5)
其中 是 的高4位, 是 的低12位。将式(5-5)代入式(5-4),经整理后得:
(5-6)
再设: (5-7)
其中 为整数, 为16位二进制余数。将式(5-7)代入式(5-6),如上类推,最后得:
(5-
很显然,十六位二进制数 既是我们要求的CRC码。
式(5 -7)是编写按字节计算CRC程序的关键,它说明计算本字节后的CRC码等于上一字节CRC码的低12位左移4位后,再加上上一字节余式CRC右移4位(也既取高4位)和本字节之和后所求得的CRC码,如果我们把4位二进制序列数的CRC全部计算出来,放在一个表里,采用查表法,每个字节算两次(半字节算一次),可以在速度和内存空间取得均衡。由此不难理解下面按半字节求CRC码的C语言程序。*ptr指向发送缓冲区的首字节,len是要发送的总字节数,CRC余式表是按0x11021多项式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}
crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暂存CRC的高四位 */
crc<<=4; /* CRC右移4位,相当于取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC,
然后加上上一次CRC的余数 */
da=((uchar)(crc/256))/16; /* 暂存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相当于CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC,
然后再加上上一次CRC的余数 */
ptr++;
}
return(crc);
}
[code]
5 结束语
以上介绍的三种求CRC的程序,按位求法速度较慢,但占用最小的内存空间;按字节查表求CRC的方法速度较快,但占用较大的内存;按半字节查表求CRC的方法是前两者的均衡,即不会占用太多的内存,同时速度又不至于太慢,比较适合8位小内存的单片机的应用场合。以上所给的C程序可以根据各微处理器编译器的特点作相应的改变,比如把CRC余式表放到程序存储区内等。[/code]
hjzgq 回复于:2003-05-15 14:12:51
CRC32算法学习笔记以及如何用java实现 出自:csdn bootcool 2002年10月19日 23:11 CRC32算法学习笔记以及如何用java实现
CRC32算法学习笔记以及如何用java实现
一:说明
论坛上关于CRC32校验算法的详细介绍不多。前几天偶尔看到Ross N. Williams的文章,总算把CRC32算法的来龙去脉搞清楚了。本来想把原文翻译出来,但是时间参促,只好把自己的一些学习心得写出。这样大家可以更快的了解CRC32的主要思想。由于水平有限,还恳请大家指正。原文可以访问:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。
二:基本概念及相关介绍
2.1 什么是CRC
在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(Cyclic Rendancy Check/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。
CRC校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模,加减时不进,错位,如同逻辑异或运算。
2.2 CRC的运算规则
CRC加法运算规则:0+0=0
0+1=1
1+0=1
1+1=0 (注意:没有进位)
CRC减法运算规则:
0-0=0
0-1=1
1-0=1
1-1=0
CRC乘法运算规则:
0*0=0
0*1=0
1*0=0
1*1=1
CRC除法运算规则:
1100001010 (注意:我们并不关心商是多少。)
_______________
10011 11010110110000
10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = 余数
2.3 如何生成CRC校验码
(1) 设G(X)为W阶,在数据块末尾添加W个0,使数据块为M+ W位,则相应的多项式为XrM(X);
(2) 以2为模,用对应于G(X)的位串去除对应于XrM(X)的位串,求得余数位串;
(3) 以2为模,从对应于XrM(X)的位串中减去余数位串,结果就是为数据块生成的带足够校验信息的CRC校验码位串。
2.4 可能我们会问那如何选择G(x)
可以说选择G(x)不是一件很容易的事。一般我们都使用已经被大量的数据,时间检验过的,正确的,高效的,生成多项式。一般有以下这些:
16 bits: (16,12,5,0) [X25 standard]
(16,15,2,0) ["CRC-16"]
32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]
三: 如何用软件实现CRC算法
现在我们主要问题就是如何实现CRC校验,编码和解码。用硬件实现目前是不可能的,我们主要考虑用软件实现的方法。
以下是对作者的原文的翻译:
我们假设有一个4 bits的寄存器,通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。
3 2 1 0 Bits
+---+---+---+---+
Pop <-- | | | | | <----- Augmented message(已加0扩张的原始数据)
+---+---+---+---+
1 0 1 1 1 = The Poly
(注意: The augmented message is the message followed by W zero bits.)
依据这个模型,我们得到了一个最最简单的算法:
把register中的值置0.
把原始的数据后添加r个0.
While (还有剩余没有处理的数据)
Begin
把register中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
If (如果上一步的左移操作中的移出的一位是1)
register = register XOR Poly.
End
现在的register中的值就是我们要求的crc余数。
我的学习笔记:
可为什么要这样作呢?我们从下面的实例来说明:
1100001010
_______________
10011 11010110110000
10011,,.,,....
-----,,.,,....
-》 10011,.,,....
10011,.,,....
-----,.,,....
-》 00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
我们知道G(x)的最高位一定是1,而商1还是商0是由被除数的最高位决定的。而我们并不关心商究竟是多少,我们关心的是余数。例如上例中的G(x)有5 位。我们可以看到每一步作除法运算所得的余数其实就是被除数的最高位后的四位于G(x)的后四位XOR而得到的。那被除数的最高位有什么用呢?我们从打记号的两个不同的余数就知道原因了。当被除数的最高位是1时,商1然后把最高位以后的四位于G(x)的后四位XOR得到余数;如果最高位是0,商0然后把被除数的最高位以后的四位于G(x)的后四位XOR得到余数,而我们发现其实这个余数就是原来被除数最高位以后的四位的值。也就是说如果最高位是0就不需要作XOR的运算了。到这我们总算知道了为什么先前要这样建立模型,而算法的原理也就清楚了。
以下是对作者的原文的翻译:
可是这样实现的算法却是非常的低效。为了加快它的速度,我们使它一次能处理大于4 bit的数据。也就是我们想要实现的32 bit的CRC校验。我们还是假设有和原来一样的一个4 "bit"的register。不过它的每一位是一个8 bit的字节。
3 2 1 0 Bytes
+----+----+----+----+
Pop <-- | | | | | <----- Augmented message
+----+----+----+----+
1<------32 bits------> (暗含了一个最高位的“1”)
根据同样的原理我们可以得到如下的算法:
While (还有剩余没有处理的数据)
Begin
检查register头字节,并取得它的值
求不同偏移处多项式的和
register左移一个字节,最右处存入新读入的一个字节
把register的值和多项式的和进行XOR运算
End
我的学习笔记:
可是为什么要这样作呢? 同样我们还是以一个简单的例子说明问题:
假设有这样的一些值:
当前register中的值: 01001101
4 bit应该被移出的值:1011
生成多项式为: 101011100
Top Register
---- --------
1011 01001101
1010 11100 + (CRC XOR)
-------------
0001 10101101
首4 bits 不为0说明没有除尽,要继续除:
0001 10101101
1 01011100 + (CRC XOR)
-------------
0000 11110001
^^^^
首4 bits 全0说明不用继续除了。
那按照算法的意思作又会有什么样的结果呢?
1010 11100
1 01011100+
-------------
1011 10111100
1011 10111100
1011 01001101+
-------------
0000 11110001
现在我们看到了这样一个事实,那就是这样作的结果和上面的结果是一致的。这也说明了算法中为什么要先把多项式的值按不同的偏移值求和,然后在和 register进行异或运算的原因了。另外我们也可以看到,每一个头字节对应一个值。比如上例中:1011,对应01001101。那么对于 32 bits 的CRC 头字节,依据我们的模型。头8 bit就该有 2^8个,即有256个值与它对应。于是我们可以预先建立一个表然后,编码时只要取出输入数据的头一个字节然后从表中查找对应的值即可。这样就可以大大提高编码的速度了。
+----+----+----+----+
+-----< | | | | | <----- Augmented message
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+-----> +----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+
以下是对作者的原文的翻译:
上面的算法可以进一步优化为:
1:register左移一个字节,从原始数据中读入一个新的字节.
2:利用刚从register移出的字节作为下标定位 table 中的一个32位的值
3:把这个值XOR到register中。
4:如果还有未处理的数据则回到第一步继续执行。
用C可以写成这样:
r=0;
while (len--)
r = ((r << | p*++) ^ t[(r >> 24) & 0xFF];
可是这一算法是针对已经用0扩展了的原始数据而言的。所以最后还要加入这样的一个循环,把W个0加入原始数据。
我的学习笔记:
注意不是在预处理时先加入W个0,而是在上面算法描述的循环后加入这样的处理。
for (i=0; i<W/4; i++)
r = (r << ^ t[(r >> 24) & 0xFF];
所以是W/4是因为若有W个0,因为我们以字节(8位)为单位的,所以是W/4个0 字节。注意不是循环w/8次
以下是对作者的原文的翻译:
1:对于尾部的w/4个0字节,事实上它们的作用只是确保所有的原始数据都已被送入register,并且被算法处理。
2:如果register中的初始值是0,那么开始的4次循环,作用只是把原始数据的头4个字节送入寄存器。(这要结合table表的生成来看)。就算 register的初始值不是0,开始的4次循环也只是把原始数据的头4个字节把它们和register的一些常量XOR,然后送入register中。
3A xor B) xor C = A xor (B xor C)
总上所述,原来的算法可以改为:
+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+
算法:
1:register左移一个字节,从原始数据中读入一个新的字节.
2:利用刚从register移出的字节和读入的新字节XOR从而产生定位下标,从table中取得相应的值。
3:把该值XOR到register中
4:如果还有未处理的数据则回到第一步继续执行。
我的学习笔记:
对这一算法我还是不太清楚,或许和XOR的性质有关,恳请大家指出为什么?
谢谢。
到这,我们对CRC32的算法原理和思想已经基本搞清了。下章,我想着重根据算法思想用java语言实现。
hjzgq 回复于:2003-05-15 14:14:51
数学算法一向都是密码加密的核心,但在一般的软路加密中,它似乎并不太为人们所关心,因为大多数时候软体加密本身实现的都是一种编程上的技巧。但近几年来随着序列号加密程序的普及,数学算法在软体加密中的比重似乎是越来越大了。
我们先来看看在网路上大行其道的序列号加密的工作原理。当用户从网路上下载某个Shareware -- 共享软体后,一般都有使用时间上的限制,当过了共享软体的试用期后,你必须到这个软体的公司去注册后方能继续使用。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软体公司,软体公司会根据用户的信息计算出一个序列码出来,在用户得到这个序列码后,按照注册需要的步骤在软体中输入注册信息和注册码,其注册信息的合法性由软体验证通过后,软体就会取消掉本身的各种限制。这种加密实现起来比较简单,不需要额外的成本,用户购买也非常方便,在网上的软体80%都是以这种方式来保护的。
我们可以注意到软体验证序列号的合法性过程,其实就是验证用户名与序列号之间的换算关系是否正确的过程。其验证最基本的有两种,一种是按用户输入的姓名来生成注册码,再同用户输入的注册码相比较,公式表示如下:
序列号 = F(用户名称)
2. 什么是“2121”校验方法
2121校验应该就是利用Luhn算法
Luhn 算法或是Luhn
公式,也被称作“模10算法”。它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans
Peter Luhn所创造,于1954年1月6日提出该专利的申请,并于1960年8月23日被授予,在美国的专利号为2950048。
该算法一直都被大家所公用,并且时至今日应用也很广泛。它被指定在ISO/IEC7812-1。它的目的不是成为一种加密安全的哈希函数;它的目的是防止意外出现的错误,而不是恶意攻击。很多信用卡和众多的政府身份识别号码都使用该算法从一系列的随机数字中提取有效的数字。
优点和缺点
Luhn
算法会检测到任何单码的错误以及几乎所有的相邻数字换位的错误。但是它不会检测两个数字序列09转90的错误(反之亦然)。它会检测到十分之七的相同双位数错误(不会检测到22和55的互换,33和66的互换,44和77的互换)。其他更复杂的检查数字算法,如费尔赫夫算法,可以检测出更多的转录错误。模N的Luhn算法是Luhn算法的一个扩展,支持非数字字符串。因为该算法采取了从右向左的方式,而且零位会影响计算的结果。只有当零位造成了数位的移动或是用零来填充一串数字的开头时才不会影响计算结果的生成。因此不论在将1234用零填充为0001234之前或是之后,使用Luhn算法得到的结果都是一样的。
该算法在美国专利上是为了给手持或是机械设备计算校验码。所以它必须尽可能的简单。
非正式的解释
该公式会通过校验码对一串数字进行验证。校验码通常会被加到账户号码中,从而拼合成一个完整的账户号码。拼合后的账户号码要通过以下的测试:
1.从校验位开始计数(校验位一般添加在账户的最后面),按从右向左的顺序,将偶数都乘以2.
2.将得到的结果相加起来(例如:10=1+0=1,14=1+4=5,也有的说法是若是乘2的结果是两位数的话,那么就直接减去9,和之前位数拆开相加的结果是一样的),然后再与原数字串的奇数位相加。
3.如果加起来的和模10后为0(也就是相加的结果是以0结尾的,10的倍数),那么这个数字串根据Luhn算法来说就是有效的,反之就是无效的。
假设一个字符串为“7992739871”,我们为其加上一个校验位,最后组成的数字为7992739871x:
账户号码: 7 9 9
2 7 3
9 8 7 1 x
将偶数位乘以2:7 18 9 4 7 6 9
16 7 2
x
相加后的数字: 7 9 9 4 7 6 9 7 7
2 =67
校验码x是通过将相加后的数字乘以9后,在进行模10计算(那么就是:(67*9)mod10,也有的说法是取比相加的和最小的10的整数倍数字,其实结果都是一样的)。通俗地说:
1.计算所有位数的和(67)。
2.将其乘以9(603)。
3.取最后一位数字(3)。
4.得到的结果就是校验位。
另外一种得到校验位的方法:先计算所有位数的和,用10减去所有位数和模10的结果。(67的个位是7;10-7=3即为校验位)。通俗地说:
1.计算所有位数的和(67)。
2.取个位数(7)。
3.用10减去个位数(3)。
4.得到的结果就是校验位。
这样,我们得到的完整的账户号码是:7992739871x。
下面的每一个数字 79927398710, 79927398711, 79927398712, 79927398713, 79927398714,
79927398715, 79927398716, 79927398717, 79927398718,
79927398719都给以用如下的方法进行验证。
1.从最右边开始计算,将偶数位都乘以2:(1*2)=2,(8*2)=16,(3*2)=6,(2*2)=4,(9*2)=18
2.将每一位数字加起来:x(校验位)+(2)+7+(1+6)+9+(6)+7+(4)+9+(1+8)+7=X+67.
3.如果得到的结果是10的倍数,那么这个账户号码就可能是有效的。需要注意的是3就是唯一的可以使得和(67+x)是10的整数倍的个位数。
4.因此,以上的所有账户除了79927398713 是有效的以外,其他均为无效的账户。
校验位的验证的代码实现
以下通过Python来实现的:
def luhn_checksum(card_number):
def digits_of(n):
return [int(d) for d in str(n)]
digits = digits_of(card_number)
odd_digits = digits[-1::-2]
even_digits = digits[-2::-2]
checksum = 0
checksum += sum(odd_digits)
for d in even_digits:
checksum += sum(digits_of(d*2))
return checksum % 10
def is_luhn_valid(card_number):
return luhn_checksum(card_number) == 0
校验位的计算
上面的算法检查输入校验位的有效性。计算校验位需要一个小的适应算法,即:
1.切换奇/偶乘法。
2.如果得到的和(sum)模10等于0的话,那么校验码就是0。
3.否则,校验码就等于10减去得到的和模10(10 - (sum mod 10))
def calculate_luhn(partial_card_number):
return 10 - luhn_checksum(int(partial_card_number) * 10)
3. 2010电子商务师模拟试题及答案
一、单选题
1.中央处理单元(CPU)的两个主要组成部分是运算器和()。C
(A)寄存器
(B)主存储器
(C)控制器
(D)辅助存储器
2.计算机网络是用通信线路把分散布置的多台独立计算机及专用外部设备互连,并配以相应的()所构成的系统。D
(A)系统软件
(B)应用软件
(C)操作系统
(D)网络软件
3.下列电子商务网站中,()属水平B2B电子商务。(C)
(A)Dell电脑
(B)Cisco
(C)环球资源网
(D)上海书城
4.网络广告策略属于()的研究范围。D
(A)价格策略
(B)渠道策略
(C)产品策略
(D)促销策略
5.()是指利用交通工具一次向单一目的地长距离地运送大量货物的移动。(C)
(A)运输
(B)配送
(C)输送
(D)物流
6.在市内运输中,由生产厂经由物流企业(如配送中心)为用户提供商品时,从配送中心到用户之间的物品空间移动称为()。(C)
(A)运输
(B)输送
(C)配送
(D)物流
7.企图利用漏洞达到恶意目的的威胁代理称之为()。(B)
(A)邮件爆炸
(B)攻击
(C)漏洞
(D)威胁
8.电子商务系统()保护数据不被篡改、破坏和非法复制。 C
(A)硬件安全
(B)运行安全
(C)软件安全
(D)安全立法
9.电子商务过程中,人们需要用()来相互证明各自的身份。(C)
(A)电子邮箱账号
(B)电子指纹
(C)电子签字机制
(D)IP地址
10.典型的电子商务支付应该是()。(D)
(A)银行转帐
(B)电话支付
(C)货到付款
(D)网上支付
11.在HTML中,()是网页主体的标记。(D)
(A)<head>
(B)<title>
(C)<html>
(D)<body>
12.在 HTML中,type属性用来显示不同形状的项目符号,它使用在()标记中。(C)
(A)<ul>
(B)<p>
(C)<li>
(D)<ol>
13.在 HTML中,()标记符是非成对标记符。(A)
(A)<br>
(B)<p>
(C)<ul>
(D)<a>
14.使用外部样式文件需要在文档的头部区域使用的标记是()。(A)
(A)<link>
(B)<class>
(C)<style>
(D)<a>
15.样式表文件的后缀名是()。(A)
(A)css
(B)htm
(C)html
(D)asp
16.()无法单独存在,必须附属在HTML中执行。 A
(A)VBScript
(B)JavaScript
(C)Delphi
(D)C语言
17.FTP常用的服务是()。(B)
(A)超文本传输
(B)下载
(C)ls
(D)远程登录
18.在()中计算机可以使用超终端通信。(A)
(A)对等网络
(B)广播式网络
(C)非对等网络
(D)VPN
19.()类邮件列表,只有经过邮件列表管理者许可的电子邮件才能发送给其他订户。C
(A)公开
(B)阻止
(C)管制
(D)封闭
20.移动存储设备最大的优势在于()。(C)
(A)标准存储单位成本低
(B)存储量大
(C)易保存,受外界影响更小
(D)方便易用
21.关系数据库使用()表示实体及其联系。(C)
(A)记录
(B)字段
(C)数据表
(D)SQL
22.新闻组中()顶级类别表示关于新闻组本身的主题。(B)
(A)alt
(B)news
(C)misc
(D)talk
23.网络市场调研问卷的问题一般不要超过()个。C
(A)10
(B)15
(C)20
(D)30
24.在对竞争对手的调研活动中,() 发挥着重要作用。(B)
(A)网上直接调研
(B)网上间接调研
(C)E-mail问卷
(D)Focus-Group
25.在网络调研中,()一般用来再次向填写者表示感谢或致意,此外注明公司的标志性信息(如公司名称、网站、联系方式),这是宣传公司形象的好机会。(D)
(A)卷首说明
(B)调研问题
(C)调研内容
(D)结束语
26.()主要是为顾客提供一个友好的购物环境,包括用户注册、店面浏览,商品定购等部分。(A)
(A)前台商务系统
(B)后台商务系统
(C)店面管理系统
(D)站点管理系统
27.()是为了让上网的用户不用等到多媒体文件完全下载完就开始播放的一种技术。D
(A)条形码技术
(B)射频技术
(C)多媒体技术
(D)动画流技术
28.因为网络广告()的特征,使得公司在网络上许多位置放置公司的广告和相关产品介绍。(C)
(A)回馈快
(B)效率高
(C)成本低
(D)交互强
29.物流信息系统分析工作的总结称之为()。(B)
(A)物流环境分析报告
(B)信息分析报告
(C)数据流分析报告
(D)业务分析报告
30.在网上单证设计过程中,要注意保证订单在商城未确认前的()。(C)
(A)可转换性
(B)可传递性
(C)可修改性
(D)可追述性
31.客户的购买记录属于()信息。(D)
(A)客户的静态
(B)客户的操作
(C)客户的动态
(D)客户的行为
32.电子合同是通过计算机网络系统订立的、以()的方式生成、储存或传递的合同。(D)
(A)数据文件
(B)数字电文
(C)数字文件
(D)数据电文
33.数字化信息附着在软件光盘上,称为()。A
(A)有形信息产品
(B)无形信息产品
(C)非信息产品
(D)信息服务
34.在电子商务中,合同的()发生了极大的变化。(C)
(A)意义
(B)作用
(C)形式
(D)功能
35.()是SSL协议的基本特点。(D)
(A)能对通信双方的身份进行认证
(B)进行协商的双方的秘密是安全的
(C)协商是可靠的
(D)连接是专用的
36.SET协议是在()之上的应用层的网络标准协议。(D)
(A)数据链路层
(B)物理层
(C)传输层
(D)对话层
37.安全电子交易是基于互联网的支付,是授权业务信息传输的安全标准,它采用()公开密钥体系对通信双方进行认证。(D)
(A)HASH
(B)DES
(C)RC4
(D)RSA
38.下列属于网络客户服务工具的是()。A
(A)FAQ
(B)ERP
(C)CRM
(D)SCM
39.()是指完成交易之后为顾客提供的服务。主要包括产品的技术支持和技术服务及为客户提供的增值服务。(D)
(A)售前服务
(B)售中服务
(C)售后服务
(D)沟通服务
40.网络客户反馈信息通常都是以()方式传递的。(B)
(A)电话
(B)E-mail
(C)上门访问
(D)邮局邮件
41.()条形码包括生产日期、有效日期、运输包装的序号、重量、地址等信息。(D)
(A)EAN-13
(B)DUN-14
(C)DUN-16
(D)EAN-128
42.配装成本中包括()。A
(A)配装材料费用
(B)配送间接费用
(C)物流中心制造费用
(D)分拣设备折旧费用
43.物流运输企业与供应链参与各方整合在一起形成( )。(C)
(A)物流企业
(B)供应链结合体
(C)第三方物流
(D)物流供应链
44.条码是由一组规则的、不同宽度的条和空组成的标记,其中对光线反射率低的是( )。(A)
(A)条
(B)空
(C)相同
(D)粗条
45.电子订货系统简称是()。(D)
(A)POS
(B)EPS
(C)GPS
(D)EOS
46.()属于物流组织结构与功能分析的主要内容。(A)
(A)物流数据分析
(B)组织结构分析
(C)业务过程与组织结构之间的联系分析
(D)业务流程分析
47.应用()技术的车辆运行管理系统只适用于小范围的通信联络。A
(A)MCA
(B)通信卫星
(C)GPS
(D)GIS
48.企业采购和付款业务循环内部控制使用的基本文件中,()是由采购部门编制的授权供应方提供商品的预先编号的文件。(B)
(A)请购单
(B)订单
(C)验收单
(D)借项通知单
49.采购申请模块的功能包括()。D
(A)对于已通过的采购申请,邮件通知申请者
(B)对于已通过的采购申请,提交给采购管理模块
(C)制定年度或月份采购计划
(D)接受企业ERP系统自动提交的原材料采购申请
50.报价采购中,报价单的有效期是指()。(A)
(A)报价送达对方所在地时的日期
(B)报价日期
(C)报价单发送日期
(D)开标日期
51.逾期率是供应商评价指标中的()指标。(C)
(A)价格
(B)品质
(C)交期交量
(D)配合度
52.()是企业对供应商最基本的行为约束,也是二者保持合作关系的基本保障。(C)
(A)供应商评价体系
(B)供应商考核体系
(C)供应商行为准则
(D)供应商行业规范
53.设计加密系统时,真正需要保密的是()。A
(A)密钥
(B)加密算法
(C)解密算法
(D)密文
54.使用DES算法加密的算法步骤是( )。(A)
(A)将明文分组、初始置换,迭代过程,逆初始置换,输出64位码的密文
(B)初始置换,将明文分组、逆初始置换,迭代过程,输出64位码的密文
(C)初始置换,迭代过程,将明文分组、逆初始置换,输出64位码的密文
(D)将明文分组、初始置换,逆初始置换迭代过程,,输出64位码的密文
55.在安全电子邮件中,收信的协议是( )。(C)
(A)SMTP
(B)HTTP
(C)POP3
(D)FTP
56.OSI是( )。(B)
(A)国际标准化组织
(B)安全体系结构
(C)质量管理体系
(D)国家标准的环境管理体系
57.瞬时复制技术是( )。(A)
(A)使计算机在某一灾难时刻自动复制数据的技术
(B)快速产生和维护一份或多份数据库数据的复制
(C)在远程备份中心提供主数据中心的磁盘镜像
(D)人工快速复制备份数据
58.用特征代码法检测病毒()。(C)
(A)能检测未知病毒
(B)误报率高
(C)可识别病毒的名称
(D)不能做解毒处理
59.引导型病毒将病毒寄生在硬盘( )。(A)
(A)逻辑0扇区或软件0扇区
(B)逻辑1扇区或软件1扇区
(C)逻辑2扇区或软件2扇区
(D)逻辑3扇区或软件3扇区
60.判断病毒的触发条件,实施病毒的破坏功能的模块是( )。(C)
(A)传染模块
(B)引导模块
(C)表现模块
(D)以上都不是
二、多选题
61.计算机网络的分类标准很多,按拓扑结构可分为()。(BCD)
(A)广播型
(B)星型
(C)总线型
(D)环型
62.电子商务的基本组成要素包括用户、商家以及()等。(ABCD)
(A)物流配送
(B)认证中心
(C)银行
(D)网络
63.网络产品策略包括()。AD
(A)产品选择策略
(B)网络直销策略
(C)网络广告策略
(D)销售服务策略
64.计算机信息系统安全产品是用来保护计算机信息系统安全的专用的硬件和软件产品,如()。(AC)
(A)网络防火墙
(B)解密软件
(C)防病毒软件
(D)压缩软件
65.在电子商务条件下,买方应当承担的义务包括()。(ABD)
(A)按照网络交易规定方式支付价款的义务
(B)按照合同规定的时间、地点和方式接受标的物的义务
(C)对标的物的质量承担担保义务
(D)对标的物验收的义务
66.下列关于字体标记color属性的描述正确的有()。 ACD
(A)定义文字的颜色
(B)定义文字的字体
(C)可以用颜色的英文名称表示颜色
(D)可以用16进制的RGB代码表示颜色
67.在 HTML中,()是表格使用的标记。(BCD)
(A)<ul>
(B)<table>
(C)<tr>
(D)<td>
68.在FrontPage中,能加入DHTML效果的事件有()。(ABCD)
(A)单击
(B)双击
(C)鼠标悬停
(D)网页加载
69.关于CSS的应用,正确的说法有()。(ABCD)
(A)外部样式是独立的CSS文件
(B)内联式样式只包含在与它有关的标记内
(C)应用嵌入式样式,要将CSS代码置于<HEAD>和</HEAD>之间
(D)应用嵌入式样式,要将CSS代码置于<!--和-->之间
70.网络下载软件JetCar具有的特点包括()。(ACD)
(A)支持断线续传
(B)能创建有限数目的类别
(C)支持MMS和RTSP协议
(D)具有预防病毒侵害的安全机制
71.下列关于音频技术的描述正确的有()。 BCD
(A)存储介质磁性变化不影响模拟音频的回放质量
(B)MIDI音乐是电脑特有的
(C)数字音频技术将声波波形转换成二进制数据
(D)Sound Forge是一种音频编辑工具
72.以下()SQL语句属于数据操纵语言。(BD)
(A)Alter
(B)Select
(C)Create
(D)Update
73.撰写网络市场调研计划书需要()。ABCD
(A)确定调研的目标和范围
(B)制定调研计划
(C)说明调研人员组成
(D)明确调研时间和资金限制
74.网上市场调研项目的范围包括(ABCD)
(A)背景
(B)目的
(C)委托人
(D)项目负责人
75.网上市场调研的相关计划有()。(ABC)
(A)时间计划
(B)沟通计划
(C)人力资源计划
(D)营销计划
76.网络感性诉求广告的创意方法有()。(ABC)
(A)感知效应
(B)情趣效应
(C)情感效应
(D)利益效应
77.进行网上购物的消费者可以分为()等类型。(ABCD)
(A)简单型
(B)冲浪型
(C)议价型
(D)接入型
78.设计网上商店单证种类和格式需要()AB
(A)列出所需网上单证种类的名称
(B)列出各种单证的有关数据项
(C)列出各网上单证为方便客户所需要的提示语内容
(D)确定各网上单证色彩、字体、字形
79.网上订单的后台处理的过程主要包括()等。(ACD)
(A)订单准备
(B)订单传递
(C)订单储存
(D)订单登录
80.认证机构一般需承担()。(ABCD)
(A)信息披露义务
(B)信息通知义务
(C)安全义务
(D)举证义务
81.电子合同的特点有()。ACD
(A)电子数据易消失
(B)电子数据不易改动
(C)电子合同局限性
(D)可能受到计算机病毒攻击
82.SET最初是由()合作开发完成的。(AB)
(A)VISA CARD
(B)MASTER CARD
(C)AMERICAN EXPRESS CARD
(D)CITIBANK CARD
83.SET通过使用()方式加密保证了数据的保密性。(AD)
(A)公共密钥
(B)公开密钥
(C)私有密钥
(D)对称密钥
84.处理客户投诉的原则包括()。ABCD
(A)预防原则
(B)及时原则
(C)责任原则
(D)管理原则
85.FAQ是指利用网站页面向顾客提供有关()等问题的现成答案。(ABC)
(A)产品的使用
(B)技术支持
(C)企业情况
(D)订单状态
86.网上售后服务的主要特点包括()。(ABCD)
(A)方便
(B)直接
(C)个性化
(D)快捷
87.条码在仓库内部管理中的作用是()。(AC)
(A)存货盘点形成盘点报告
(B)方便入库
(C)出库备货
(D)条理存放
88.物流信息按照物流的功能分类可以分为()。(ABCD)
(A)计划信息
(B)控制及作业信息
(C)统计信息
(D)支持信息
89.判定配送合理与否的因素是多方面的,()因素属于合理范畴。(BCD)
(A)资金周转慢
(B)库存周转快于原来各企业库存周转
(C)缺货次数下降
(D)即时配送速度快
90.选择配送方法包括()。BCD
(A)确定物流服务商
(B)确定配货作业方法
(C)确定车辆配装方法
(D)确定配送路线
91.企业可以()了解供应商的能力,选择合适的供应商。(ABCD)
(A)根据供应商的信誉对比类似产品的历史情况及其他用户的使用情况
(B)根据供应商提供的样品进行评价
(C)对供应商的能力进行现场调查和评价
(D)根据是否取得有关质量认证机构的质量体系认证
92.防止企业采购中暗箱操作的措施“三统一分”,其中“三统”是指所有采购商品要()。(BCD)
(A)统一控制费用
(B)统一采购验收
(C)统一审核结算
(D)统一转账付款
93.对供应商进行调查,调查表应尽量用()进行表述。(BC)
(A)文字
(B)数据
(C)量值
(D)实例
94.电子商务信息保密性需求包括()。AB
(A)信息的隐私问题
(B)交易内容的保密性
(C)服务器的真实性
(D)交易双方身份的真实性
95.对电子邮件的加密主要方法有( )。(AB)
(A)使用PGP插件
(B)使用数字证书
(C)用系统自带的加密功能
(D)用压缩加密软件
96.安全交易体系中具有代表性的交易规范协议有( )。(BC)
(A)TCP/IP
(B)SET
(C)SSL
(D)HTTP
97.支撑软件的维护需要做到()。ABCD
(A)定期清理日志文件
(B)定期清理临时文件
(C)定期执行整理文件系统
(D)处理运行中死机情况
98.计算机安全是指一种确定状态,使计算机化数据和程序文件不致被()访问、获取或修改。(BCD)
(A)授权人员
(B)计算机
(C)程序
(D)非授权人员
99.校验算法的缺点是( )。(ABD)
(A)不能识别病毒名称
(B)不能对付隐蔽性病毒
(C)不能发现未知病毒
(D)容易误报警
100.堡垒主机的系统软件可用于( )。(ABC)
(A)维护系统日志
(B)硬件复制日志
(C)远程日志
(D)用户操作日志