|
本帖最后由 hotpower 于 2009-8-11 01:41 編輯
![]()
http://vipblog.cqvip.com/user1/3643147/
HotWC3已升級(jí)到128位流密碼體系。
點(diǎn)擊直接運(yùn)行: 128位HotWC3/CRC通用網(wǎng)上演算器V3.08
![]()
王老在某次郵件中指出:
XXX:你好!
...
我想請(qǐng)你能將你的方案寫一個(gè)較簡(jiǎn)明的說明,給出一個(gè)原理圖(不是軟件實(shí)現(xiàn)的流程圖),將流密鑰生成器的主要運(yùn)算和步驟描述清楚,能反映出你的主要涉及思想和新穎之處。能讓別人能明白你的方案。
當(dāng)我能搞清楚了你的設(shè)計(jì)思想后,我們就可以做些討論了。
祝好!
王育民
王老您好!
不好意思,出差了幾天。
近日我又將CRC正運(yùn)算和逆運(yùn)算程序做了規(guī)范化,將其歸為CRC編解碼矩陣或CRC編解碼表。
這樣從編程角度很清晰,但數(shù)學(xué)證明對(duì)我很難。也許“隔行如隔山”吧。但我用窮舉證明都是對(duì)的。
只是在密碼學(xué)方面論據(jù)不足。
這些關(guān)系如下:(其中:初值為上次的密文)
//密文=CRC編碼矩陣[初值,明文]=CRC編碼矩陣[上次的密文,明文]
//密文=CRC編碼矩陣[0, 初值 xor 明文]=CRC編碼表[初值 xor 明文]
//密文=CRC編碼矩陣[0, 上次的密文 xor 明文]=CRC編碼表[上次的密文 xor 明文]
//明文=CRC解碼矩陣[初值,密文] = CRC解碼矩陣[上次的密文,密文]
//明文=初值 xor CRC解碼矩陣[0, 密文] = 初值 xor CRC解碼表[密文]
目前教科書和網(wǎng)上流傳的CRC查表法可歸納為:(注一般為左移CRCN)
//密文=CRC編碼表[((初值 >> (N-k)) ^ 明文) & (2 ** k - 1)] ^ (初值 << k)
其中N為CRCN,即CRC4,CRC8,CRC16,....k=4,8,16,... **表示乘方運(yùn)算 ^表示異或運(yùn)算 >> <<表示移位
N >= 4,一般取N>=16,k=8,即256個(gè)數(shù)據(jù)一個(gè)CRC表。
您說的“原理圖”我知道,不過太繁瑣。我畫的也不是程序流程圖。
“流密鑰生成器”我做的與鐘控、走停流密鑰偽隨機(jī)生成器相似。
總之是想得到“無限周期”的密鑰流。
圖中的子密鑰流主要為CRC核的各個(gè)參數(shù)都提供一個(gè)獨(dú)立的密鑰流。
本來CRC就是單向的,但知道了CRC密鑰就可逆了。
像A5密碼是由3個(gè)密鑰流組成的,它的核只是簡(jiǎn)單的xor,而 HotWC3的核是CRC
故可為CRC核的各個(gè)參數(shù)都提供一個(gè)獨(dú)立的密鑰流。
這就是我選擇CRC做核的主要原因,這樣破解HotWC3只能窮舉,因?yàn)镃RC的參數(shù)很多。
又由于CRC可“任意碰撞”,即冗余的原因。
一對(duì)多或多對(duì)一導(dǎo)致即使知道全部明文與密文對(duì)也無法知道CRC 密鑰。
CRC本不能作為密碼,因?yàn)樗菃蜗虻,但若加密和解密雙方都知道密鑰流即生成方法,
則加密和解密都是很容易的,反之不知道密鑰流則無法解密。
現(xiàn)列舉加密和解密程序片段:
/*
右移crc8正算法:
初值:crcvalue
權(quán)值:crcval
明文:crcbyte = 輸入
結(jié)果:crcvalue = 輸出密文或下次初值
*/
function crc8r(crcbyte)
{
var i;
crcbyte &= 0xff;//明文,它在正運(yùn)算中的作用是提供跳變標(biāo)志
//密文=CRC編碼矩陣[初值,明文]=CRC編碼矩陣[上次的密文,明文]
//密文=CRC編碼矩陣[0, 初值 ^ 明文]=CRC編碼表[初值 ^ 明文]
//密文=CRC編碼矩陣[0, 上次的密文 ^ 明文]=CRC編碼表[上次的密文 ^ 明文]
crcvalue ^= crcbyte;
for(i = 0; i < 8; i++){
if (crcvalue & 0x01)
{
crcvalue >>>= 1;
crcvalue ^= crcval;
if (checkbox.checked)//可逆選擇,不選擇將不可逆,主要驗(yàn)證權(quán)值可逆的“論據(jù)”
crcvalue |= 0x80;//強(qiáng)行可逆
}
else
{
crcvalue >>>= 1;
}
}
crcvalue &= 0xff;//輸出密文(下次的初值)
}
/*
右移crc8逆算法:
初值:crcvalue
權(quán)值:crcval
密文:crcbyte
結(jié)果:crcvalue = 輸出明文
*/
function discrc8r(crcbyte)
{
var i;
crcbyte &= 0xff;//初值
//明文=CRC解碼矩陣[初值,密文] = CRC解碼矩陣[上次的密文,密文]
//明文=初值 ^ CRC解碼矩陣[0, 密文] = 初值 ^ CRC解碼表[密文]
for(i = 0; i < 8; i++){
if(crcbyte & 0x80){//CRC正運(yùn)算時(shí)隱含告訴過需要X8權(quán)的XOR運(yùn)算
crcbyte ^= crcval;//0x8C;//CRC=X8+X5+X4 D7(X8)的XOR被下句移位破壞
crcbyte <<= 1;//與正運(yùn)算移位相反才能還原
crcbyte ^= 0x01;//強(qiáng)行可逆
}
else
{
crcbyte <<= 1;//與正運(yùn)算移位相反才能還原
}
}
crcvalue ^= crcbyte;
crcvalue &= 0xff;//輸出明文
}
祝好!
XXXX XXX 2009.8.10 1:15
我們可以發(fā)現(xiàn):
密文 = CRC編碼表[初值 xor 明文]
明文 = 初值 xor CRC解碼表[密文]
固有:
明文 xor 初值 = CRC解碼表[密文]
則:
密文 = CRC編碼表[初值 xor 明文] = CRC編碼表[CRC解碼表[密文]]
明文 = 初值 xor CRC解碼表[密文] = 初值 xor CRC解碼表[CRC編碼表[初值 xor 明文]] = CRC解碼表[CRC編碼表[明文]]
故:CRC編解碼矩陣或CRC編解碼表是可逆的。
CRC算法做CRC密碼的加密強(qiáng)度不高的原因:
根據(jù)上述推導(dǎo),“CRC編解碼表”實(shí)際就是在CRC密鑰(CRC權(quán)值和方向)確定時(shí)的置換序列。
由于CRC初值=上次CRC密文,故有:
密文 = CRC編碼表[上次CRC密文 xor 明文]
明文 = 上次CRC密文 xor CRC解碼表[密文]
故在解密CRC密碼時(shí),“初值”只是一種擺設(shè)而已,其強(qiáng)度只能由CRC密鑰(CRC權(quán)值和方向)確定。
那么若CRC初值不等于上次CRC密文,則CRC密鑰將由三部分組成:CRC初值、CRC權(quán)值和CRC移位方向。
HotWC3就是根據(jù)這個(gè)思路來達(dá)到HotWC3密碼的“一次一密”即CRC初值也在隨機(jī)變換,增大密鑰實(shí)用長(zhǎng)度。
|
|