查看: 5091|回复: 2

与王育民教授邮件中揭示的一些CRC编码矩阵与CRC编解码表之间的关系

[复制链接]
发表于 2009-8-11 01:24:11 | 显示全部楼层 |阅读模式
关键词: CRC , 教授 , 矩阵 , 邮件 , 育民
本帖最后由 hotpower 于 2009-8-11 01:41 编辑


http://vipblog.cqvip.com/user1/3643147/
HotWC3已升级到128位流密码体系。
点击直接运行: 128位HotWC3/CRC通用网上演算器V3.08


王老在某次邮件中指出:
XXX:你好!

...

     我想请你能将你的方案写一个较简明的说明,给出一个原理图(不是软件实现的流程图),将流密钥生成器的主要运算和步骤描述清楚,能反映出你的主要涉及思想和新颖之处。能让别人能明白你的方案。

     当我能搞清楚了你的设计思想后,我们就可以做些讨论了。

      祝好!

                                王育民


王老您好!
    不好意思,出差了几天。
近日我又将CRC正运算和逆运算程序做了规范化,将其归为CRC编解码矩阵或CRC编解码表。
这样从编程角度很清晰,但数学证明对我很难。也许“隔行如隔山”吧。但我用穷举证明都是对的。
只是在密码学方面论据不足。
这些关系如下:(其中:初值为上次的密文)
//密文=CRC编码矩阵[初值,明文]=CRC编码矩阵[上次的密文,明文]
//密文=CRC编码矩阵[0, 初值 xor 明文]=CRC编码表[初值 xor 明文]
//密文=CRC编码矩阵[0, 上次的密文 xor 明文]=CRC编码表[上次的密文 xor 明文]
//明文=CRC解码矩阵[初值,密文] = CRC解码矩阵[上次的密文,密文]
//明文=初值 xor CRC解码矩阵[0, 密文] = 初值 xor CRC解码表[密文]

目前教科书和网上流传的CRC查表法可归纳为:(注一般为左移CRCN)
//密文=CRC编码表[((初值 >> (N-k)) ^ 明文) & (2 ** k - 1)] ^ (初值 << k)
其中N为CRCN,即CRC4,CRC8,CRC16,....k=4,8,16,...  **表示乘方运算 ^表示异或运算 >> <<表示移位
    N >= 4,一般取N>=16,k=8,即256个数据一个CRC表。

您说的“原理图”我知道,不过太繁琐。我画的也不是程序流程图。
“流密钥生成器”我做的与钟控、走停流密钥伪随机生成器相似。
总之是想得到“无限周期”的密钥流。
图中的子密钥流主要为CRC核的各个参数都提供一个独立的密钥流。
本来CRC就是单向的,但知道了CRC密钥就可逆了。
像A5密码是由3个密钥流组成的,它的核只是简单的xor,而 HotWC3的核是CRC
故可为CRC核的各个参数都提供一个独立的密钥流。
这就是我选择CRC做核的主要原因,这样破解HotWC3只能穷举,因为CRC的参数很多。
又由于CRC可“任意碰撞”,即冗余的原因。
一对多或多对一导致即使知道全部明文与密文对也无法知道CRC 密钥。
CRC本不能作为密码,因为它是单向的,但若加密和解密双方都知道密钥流即生成方法,
则加密和解密都是很容易的,反之不知道密钥流则无法解密。
现列举加密和解密程序片段:
/*
右移crc8正算法:
初值:crcvalue
权值:crcval
明文:crcbyte  = 输入
结果:crcvalue = 输出密文或下次初值
*/
function crc8r(crcbyte)
{
var i;
  crcbyte &= 0xff;//明文,它在正运算中的作用是提供跳变标志
//密文=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)//可逆选择,不选择将不可逆,主要验证权值可逆的“论据”
     crcvalue |= 0x80;//强行可逆
}
else
{
   crcvalue >>>= 1;
}
  }
  crcvalue &= 0xff;//输出密文(下次的初值)
}
/*
右移crc8逆算法:

初值:crcvalue
权值:crcval
密文:crcbyte
结果:crcvalue = 输出明文
*/
function discrc8r(crcbyte)
{
var i;
  crcbyte &= 0xff;//初值
//明文=CRC解码矩阵[初值,密文] = CRC解码矩阵[上次的密文,密文]
//明文=初值 ^ CRC解码矩阵[0, 密文] = 初值 ^ CRC解码表[密文]
  for(i = 0; i < 8; i++){
    if(crcbyte & 0x80){//CRC正运算时隐含告诉过需要X8权的XOR运算
      crcbyte ^= crcval;//0x8C;//CRC=X8+X5+X4 D7(X8)的XOR被下句移位破坏
      crcbyte <<= 1;//与正运算移位相反才能还原
   crcbyte ^= 0x01;//强行可逆
    }
else
{
      crcbyte <<= 1;//与正运算移位相反才能还原
}
  }
  crcvalue ^= crcbyte;
  crcvalue &= 0xff;//输出明文
}
祝好!
XXXX XXX  2009.8.10 1:15


我们可以发现:
密文 = CRC编码表[初值 xor 明文]
明文 = 初值 xor CRC解码表[密文]

固有:
明文 xor 初值 = CRC解码表[密文]

则:
密文 = CRC编码表[初值 xor 明文] = CRC编码表[CRC解码表[密文]]
明文 = 初值 xor CRC解码表[密文] = 初值 xor CRC解码表[CRC编码表[初值 xor 明文]] = CRC解码表[CRC编码表[明文]]

故:CRC编解码矩阵或CRC编解码表是可逆的。

CRC算法做CRC密码的加密强度不高的原因:

根据上述推导,“CRC编解码表”实际就是在CRC密钥(CRC权值和方向)确定时的置换序列。
由于CRC初值=上次CRC密文,故有:
密文 = CRC编码表[上次CRC密文 xor 明文]
明文 = 上次CRC密文 xor CRC解码表[密文]

故在解密CRC密码时,“初值”只是一种摆设而已,其强度只能由CRC密钥(CRC权值和方向)确定。

那么若CRC初值不等于上次CRC密文,则CRC密钥将由三部分组成:CRC初值、CRC权值和CRC移位方向。

HotWC3就是根据这个思路来达到HotWC3密码的“一次一密”即CRC初值也在随机变换,增大密钥实用长度。
发表于 2010-11-3 20:49:41 | 显示全部楼层
学习
发表于 2015-2-7 10:27:39 | 显示全部楼层
支持一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表