一种应用混沌密码流加密的方法和系统的制作方法

文档序号:6573618阅读:126来源:国知局
专利名称:一种应用混沌密码流加密的方法和系统的制作方法
技术领域
本发明涉及版权保护,更具体地说,涉及一种应用混沌密码流加密的方法 和系统。
背景技术
密码系统是基于数学原理对原始信息加密和对加密的信息进行解密。本发 明使用新的数学原理一混沌原理。混沌加密方法广泛地应用于通信领域,是一 套非线性的动态等式,由一个或多个参数控制;因此混沌状态是根据参数的细 微变化而变化的,并且对初始状态敏感。人们日常能接触到的混沌系统包括 自来水龙头中流出的水,香烟中生气的烟雾,股票市场的升和跌,以及,音乐 的旋律。本发明提供了一种应用混沌原理进行对称加密的方法和系统,由于其简单 的结构,该密码系统加密速度快,且容易实施。因此,该密码系统也可以用于 低性能的处理器,并且不需要占用太多的资源。密钥用于在已选择的混沌映射 中产生混沌值。这些混沌值用于组成另一个虚拟密钥。该虚拟密钥用于对原始 /加密的信息执行运算以加密/解密。将来,这个方法也可以实现在非对称加密中。实际上,混沌密码系统是 IATOPIA密码系统的主要信息之一。通过智能代理技术(IAT)的支持,更深 层的IATOPIA密码系统的解释是版权保护技术(CPT)。发明内容本发明解决现有技术中存在的问题所釆用的技术方案是提供一种应用混沌密码流加密的方法,包括以下步骤51. 随机数字产生器产生对称密钥,并储存于存储器;52. 将产生的对称密钥值混沌映射,以产生混滩值;53. 将所述混沌值舍位,并将部分混沌值反向;54. 将所述混沌值合并组成虚拟密钥;55. 明文和所述虛拟密钥进行运算得到密文。根据本发明的另一个方面,提供一种应用混沌密码流解密的方法,包括以 下步骤51. 将所述对称密钥值混沌映射,以产生混沌值;52. 将所述混沌值舍位,并将部分混沌值反相;53. 将所述混沌值合并组成虚拟密钥;54. 密文和所述虚拟密钥进行运算得到明文。根据本发明的另一个方面,提供一种混沌密码流加密的系统,包括下述装置产生对称密钥的随机数字生成装置;用于存储所述随机数字生成装置产生的对称密钥的存储器 将产生的对称密钥值混沌映射,以产生混沌值的混沌映射装置; 将所述混沌值舍位,并将部分混沌值反向的转换装置; 将所述混沌值合并组成虚拟密钥的密钥生成装置; 将明文和所述虚拟密钥进行运算得到密文的加密装置。 根据本发明的另一个方面,提供一种混沌密码流解密的系统,包括下述装置将存储器中的对称密钥值进行混沌映射,以产生混沌值的混沌映射装置; 将所述混沌值舍位,并将部分混沌值反向的转换装置; 将所述混沌值合并组成虚拟密钥的密钥生成装置; 将密文和所述虚拟密钥进行运算以得到明文的解密装置。 本发明的加密方法完全取决于初始参数,因此,在非法解密者不知道初始参数的tl况下更难被解密。此外,本发明提出的方法和系统还可应用于任何需要加密的领域。


F而将结合附图及实施例对本发明作进一步说明,附图中图1是本发明加密装置的模块图; 图2是本发明解密装置的模块图; 图3是本发明应用混沌密码流加密的流程图; 图4是本发明应用混沌密码流解密的流程图。
具体实施方式
图1是本发明加密装置的模块图。如图1所示,本发明的加密系统包括存储器102,产生并储存对称密钥的随机数字生成装置101,将产生的对称密钥 值混沌映射,以产生混沌值的混沌映射装置103,将所述混沌值舍位,并将部 分混沌值反向的转换装置104,将所述混沌值合并组成虚拟密钥的密钥生成装 置105,将明文和所述虚拟密钥进行运算得到密文的加密装置106。图2是本发明解密装置的模块图。如图2所示,本发明的解密系统包括将 存储器中的对称密钥值进行混沌映射,以产生混沌值的混沌映射装置201,将 所述混沌值舍位,并将部分混沌值反向的转换装置202,将所述混沌值合并组 成虚拟密钥的密钥生成装置203,将密文和所述虚拟密钥进行运算以得到明文 的解密装置204。图3是本发明应用混沌密码流加密的流程图。结合图1对加密流程进行详 细描述。歩骤300,随机数字生成装置101产生对称密钥k,该密钥k可以是 可变的长度,在本实施例中采用了 32字节的长度,该密钥k存储以0到255 的ASCII值存储。歩骤305,对称密钥k存储于数据库102中以用于解密处理。 歩骤310,密钥值k被放入混沌映射装置中,在混沌映射多次后,产生一个混 沌值。步骤315,该混沌值由转换装置104舍位为整数值,例如,0.12345被 截为12345,并且某些混沌值由转换装置104反向,例如,12345颠倒为54321。 步骤320,密钥生成装置将所有混沌值组成一个虚拟密钥S,例如,12345、54321 等组成1234554321...。 S值的长度根据不同的对称密钥变化。歩骤325,明文 P被读入加密装置106。步骤330,原始信息P与虚拟密钥S多次执行运算, 例如,异或运算,以确保加密文本的随机性,在此,产生加密信息C。密钥k是具有一定数量字节的对称密钥,每个字节包括一个0至255 (十 六进制值OO至FF:)的ASCII值。所述密钥用于放入对数映射以产t一个数位用于将来的加密/解密处理。混沌值(dn)是插入kn的混沌映射产生的结果值。 tn是dn的小数部分,整数部分被截取,随后小数部分被反向。 P是明文,即加密前的信息。 C是密文,即加密后的信息。混沌映射是密码技术的核心部分。选择对数映射,如下所示a是对数映射的参数,因为对数映射的分支特性会成倍的增加映射周期以 变成混沌,所以a通常设为大于3。 x的值设为0到1。n表示在对数映射内的第n次重复,重复的次数可变,并且通常设为大于100。不仅对数映射可用于本发明加密/解密技术的核心部分,任何其它类型的 混沌映射也可用于本发明的密码技术的核心部分。此处采用对数映射的原因是 这个等式简单,不需要过多计算的资源,但其结果却复杂。本发明中的处理在 密文的随机性和加密/解密处理的速度之间找到了平衡点。所述示例性加密源代码如下 〃版本3.1〃可变密钥长度的混沌编码 〃写出密钥分离文件package enc; import java.io.*; import j ava.util. *; import java.text.*; import j ava.lang.*;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;<formula>formula see original document page 7</formula>〃打开密钥文档和文本文档if (filenamenull || filename.equals(""))System.err.println("Invalid Source Path File Name"); return;else if (dirname == null || dimame.equals(""))System.err.println("Invalid Destination Path Name"); return;'else try//打开输入文本文档,并建立输出文本文档 dataFisOl = new FileInputStream(filename); dataFis = new BufferedInputStream(dataFisO 1);〃获得文档名和扩展,并加入尾部空格 String tt = filename.getName();fhame = tt.substring(O, tt.lastIndexOf(".")); fext = tt.substring(tt,lastlndexOf(".")+l); int num—sp = 5画fext.length(); for (int i = 0; i < num—sp; i++)fext = fext + "//建立密钥文档File key—output = new File(dirname +"\\"+ fhame + ".ckl"); kfileOl = new FileOutputStream(key_output); kfile = new BufferedOutputStream(kfileO 1》byte[] strKey = KeyGenerator(); for(int i = 0; i < KEY SIZE; i++)writeBuffer02(strKey[i]);form—key();〃建立输出文档File encrypt—output = new File(dirname +"\\"+ fhame + ".cef'); defileO 1 = new FileOutputStream(encrypt—output); defile = new BufferedOutputStream(defileOl);〃对文档扩展加密 byte[] fx = fext.getBytes(); for(int i = 0; i < fx.length; i++)writeBuffer(xor—opt(i, fx[i]));〗〃读取原文档内容 int intCount = 5;int fcontent;while ((fcontent = dataFis.read()) != -1)writeBuffer(xor—opt(intCount-3,xor—opt(intCount-5,xor—opt(intCount fcontent))));defile.flush(); defile01.flush();dataFis.close();defile.close();kfile.close();dataFis01.close();defile01.close();kfile01.close();catch (IOException ioException)System.out.println("ioException " + ioException); return;intCount++;〃使用特定的密钥流对文档加密public CEncrypt—file02(File filename, File dime, String key)//打开密钥文档和文本if (filename == null || filename.equals(""))System.err.println("Invalid Source Path File Name"); return;else if (dirname == null || dirname.equals(""))System.err.println("Invalid Destination Path Name"); return;elsetry〃打开输入文本文档,并建立输出文本文档 dataFisOl = new FileInputStream(filename); dataFis = new BufferedInputStream(dataFisOl);〃获得文档名和扩展,并加入尾部空格 String tt = filename.getName();fname = tt.substring(O, tt.lastIndexOf(".")); fext = tt.substring(tt.lastlndexOf(".")+l); int num—sp = 5-fext.length();for (int i = 0; i < num—sp; i++) fext = fext十"";//建立密钥文档/= =File key—output = new File(dirname +"\V'+ fhame + ".ckl"); kfileO 1 = new FileOutputStream(key一output); kfile = new BufferedOutputStream(kfileOl);byte[] strKey = KeyGenerator(); for(int i = 0; i < KEY—SIZE; i++)writeBuffer02(strKey[i]);BASE64Decoder decoder = new BASE64Decoder(); load—key = decoder.decodeBuffer(key); form—key();〃建立输出文档File encrypt—output = new File(dirname +"\V'+ fhame + ".cef'); defileOl = new FileOutputStream(encrypt_output); defile = new BufferedOutputStream(defile01);〃对文档的扩展加密 byte[] fx = fext.getBytes();for(int i = (); i < fx.length; i++)writeBuffer(xor—opt(i, fx[i]));〃读取源文档内容int intCount = 5; int fcontent;while ((fcontent = dataFis.read()) != -1)writeBuffer(xor—opt(intCount-3,xor—opt(intCount-5,xor—opt(intCount. fcontent))));intCount++;defile.flush(); defile01.flush();dataFis.close(); defile.close(); 〃kfile.close();dataFisOl.close();defile01.close();〃kfile01.close();catch (IOException ioException)System.out.println("ioException"十ioException); return;int intKeyGen[] = new int[KEY—SIZE]; for (int n = 0; n < KEY—SIZE; n++)intKeyGen[n] = new java.util.Random().nextlnt(256); load—key[n] = (byte) intKeyGen[n];〃System.out.println("load—key[" + n + "] =" + load—key[n]); return load—key;//产生随机密钥public static String genKey()(final int KEY—SIZE=32;byte key[] = new byte[KEY—SIZE];String keytxt = new String();int intKeyGen[] = new mt[KEY一SIZE];〃产生密钥public byte[] KeyGenerator()for (int n = 0; n < KEY—SIZE; n++)intKeyGen[n] = new java.util.Random().nextlnt(256); key[n] = (byte) intKeyGen[n];〃System.out.println("load—key[" + n + "] =" + load—key[n]);}〃返还load—key;System.out.println(new String(key)); BASE64Encoder encoder64 = new BASE64Encoder(); keytxt = encoder64.encode(key); return keytxt;//使用密钥中给定的用户名产生密钥 public static String genKey(String str) {final int KEY SIZE=32;byte key[] = new byte [KEY—SIZE];String keytxt = new String();int intKeyGen[] = new int[KEY—SIZE];for (int n = 0; n < KEY—SIZE-str.length(); n++)intKeyGen[n] = new java.util.Random().nextlnt(256); key[n] = (byte) intKeyGen[n];〃System.out.println("load—key[" + n + "] =" + load一key[n]); int count = 0;for (int n = KEY—SIZE也length(); n < KEY_SIZE;n++){ key[n] = (byte)((int)str.charAt(count) + 32); count十十;〃返还load—key;System.out.println(new String(key)); BASE64Encoder encoder64 = new BASE64Encoder(); keytxt = encoder64.encode(key); return keytxt;//从混沌密钥输入密钥值用于加密 //如果加密文档不能够被解密// ej"能是密钥传递至对数映射时浮点错误private void form一key()〃将密钥输入对数映射并产生小数值 for (int i = 0; i < KEY—SIZE; i++)double nvalue = calc_opt(i);String nsvalue = Double.toString(nvalue);nsvalue = nsvalue.substring(nsvalue.lastlndexOf(".")+l);StringBuffer sb = new StringBuffer();sb.append(nsvalue);nsvalue = sb.reverse().toString();chaosstring = chaosstring + nsvalue;int ct = (int) Math.ceil((double) chaosstring.length()/2);map—key = new byte[ct];int subct=0;int subct—ed = 2;for (int i = 0; i < ct; i++)if (subct一ed 〉 chaosstring.length())subct—ed—;String tp = chaosstring.substring(subct, subct一ed); map—key[i] = Byte.parseByte(tp); if(i%2=,map—key[i] = (byte) (255 - map—key[i]); elsemap—key[i〗=map一key[i];〃 System.out.println("map—key["+i+"]=="+map—key[i]); subct+=2; subct ed+=2;private double LogisticMap(int k)double b = 3.78;double lm = ((double) k / 512);for (int loop = 0; loop < k; loop++)lm = b * lm * (1 - lm); return Math.abs(lm);〃将噪音加入管理数据private double calc—opt(int loop—count)〃对文档内容执行异或操作private byte xor—opt (int loop—count, int pvalue)〃转换为二进制并输出文档 private void writeBuffer(byte s)//输出密钥文档 private void writeBuffer02(byte s)图4是本发明文档读取模块对信息解密的流程图。步骤405,密钥值被放 入混沌映射装置201中,在混沌映射多次后,产生一个混沌值。步骤410,该 混沌值由转换装置202舍位为整数值,例如,,0.12345被截为12345,并且某 些混沌值被转换装置202反向,例如,12345颠倒为54321。歩骤415,密钥 生成装置203将所有混沌值组成-一个虚拟密钥S,例如,12345、 54321等组成 1234554321...。 S值的长度根据不同的对称密钥变化。歩骤420,密文C被读 入存储器。步骤425,加密信息C与虚拟密钥S多次执行运算,例如,异或运 算,以产生原始信息P。所述例性解密源代码如下: 〃版本3.1〃各种密钥长度的混沌解密 〃从分离的文档输入读取package enc; import java.io.*; import java.util.*; import java.text.*; import java.lang.*;import sun.misc.BASE64Decoder;public class CDecrypt—file02 {〃初始化变量FilelnputStreaminfile01; 〃加密数据输入流BufferedI叩utStream infile;FileI叩utStream kfileO 1; 〃密钥输入流BufferedlnputStream kfile; FileOutputStreamdefile01; 〃输出解密文档 BufferedOutputStream defile;final int KEY—SIZE ==32; final mt MSG—SIZE := 16;public String fhame =""; public String fext ="";public CDecrypt—file02(File filename, File key_file, File dirname)〃打开密钥文档和文本文档if (filename == null || filename.equals(""》System.err.printlnC'Invalid Source File Path Name");〃System.exit(l);return;else if (dirname == null || dimame.equals(""))、System.err.println("Invalid Destination Path Name"); return;〃System.exit(l);else itry、//使用管理文档名作为解密文档名String tt = filename.getName();fname = tt.substring(O, tt.lastIndexOf("."));〃打开密钥文档kfileOl = new FilelnputStream(key—file); kfile = new BufferedInputStream(kfileOl);〃从key—file读取密钥kfile .read(load—key); form一key();〃打开输入文本文档并建立输出文本文档infile01 = new FileI叩utStream(filenarne); 〃 open text fileinfile = new BufferedlnputStream(infile01);〃读取源文档内容 int char—ct = 0;//文档扩展String fext ="";byte[] cext = new byte[5];infile,read(cext);for (int i= 0;i<5;i++)fext = fext + (char) xor—opt(i, cext[i]);//解密文档路径和名称File fileOut = new File(dirname + "\\" + fname + "." + fext.trim()); defileOl = new FileOutputStream(fileOut); defile = new BufferedOutputStream(defileOl);〃读取源文档内容 int intCount = 5;int rem = 0; int fcontent;while ((fcontent = infile.read()) != -1)writeBuffer(xor—opt(intCount,xor一opt(intCount隱5,xor—opt(intCount-3 fcontent))));intCount++;defile.flush(); defileOl.flush();infile.close(); defile.close(); kfile.close();infileOl.close(); defileOl.close(》 kfileOl.close();catch (IOException ioException)〃System.out.printlnC'ioException " + ioException.getMessage());ioException,printStackTrace();〃System.exit(l);return;public CDecrypt—file02(File filename, String key, File dimame)//打开密钥文档和文本文档if (filename == null || filename.equals(""))System.err.println("Invalid Source File Path Name"); return;〃System.exit(l);else if (dirname == null || dimame.equals(""))System.err.println("Invalid Destination Path Name"); return;〃System.exit(l); else try〃使用管理文档名作为解密的文档名 String tt = filename.getName();fname = tt.substring(O, tt.lastIndexOf("."));〃打开密钥文档 /沐kfileOl = new FilelnputStream(key—file); kfile = new Bufferedl叩utStream(kfile01);//从key—file读取密钥 kfile.read(load—key);*/BASE64Decoder decoder = new BASE64Decoder(); load—key = decoder.decodeBuffer(key); form—key ();〃打开输入文本文档并建立输出文本文档infileOl = new FileInputStream(filename); 〃 open text fileinfile = new BufferedInputStream(infileOl);〃读取源文档内容Read source file content int char一ct = 0;//文档扩展String fext ="";byte口 cext = new byte [5];infile.read(cext);for (int i= 0; i < 5; i++)fext = fext + (char) xor一opt(i, cext[i]);〃解密文档路径和名称File fileOut = new File(dirname + "\\" + fhame + "." +fext.trim());defile01 =new FileOutputStream(fileOut); defile = new BufferedOutputStream(defileOl);//读取源文档内容 int intCount = 5; int rem = 0; int fcontent;while ((fcontent = infile.read(》!= -1)writeBuffer(xor—opt(intCount,xor—opt(intCount-5,xor—opt(intCount陽3 fcontent))));intCount++;defile.flush(); defileOl.flush();infile.close();defile.close(); 〃kfile.close();infile01.close(》 defile01.close(); 〃kfile()l.close();〃System.out.println("ioException " + ioException.getMessage());ioException.printStackTrace();return;〃System.exit(l);double nvalue = calc—opt(i);String nsvalue = Double.toString(nvalue);nsvalue = nsvalue.substring(nsvalue.lastlndexOf(".")+l);StringBuffer sb = new StringBuffer();sb. append(n s value);nsvalue = sb.reverse().toString();chaosstring = chaosstring + nsvalue;int ct = (int) Math.ceil((double) chaosstring.length()/2); map—key = new byte[ct];〃从混沌密钥输入密钥值用作加密private void form—key()for (int i = 0; i < KEY—SIZE; i++)int subct=0;int subct—ed = 2;for (int i = 0; i < ct; i++)if (subct—ed 〉 chaosstring.length(》subct一ed—;iString tp = chaosstring.substring(subc:t, subct—ed); map_key[i] = Byte.parseByte(tp); if(i%2==0)map一key[i] = (byte) (255 - map—key[i]); elsemap—key [i] = map一key[i]; 〃 System.out.println("map—key["+i+"]=="+map—key[i]); subct+=2; subct—ed+=2;//输入密钥值,限制为0-〉l的值,〃运行对数映射k次,返还结果被密钥值乘private double LogisticMap(int k)private double calc—opt(int loop—count)〃文档的异或操作private byte xor—opt (int loop count, int pvalue)〃转换为二进制数据并输出文档private void writeBuffer(byte s)
权利要求
1. 一种应用混沌密码流加密的方法,其特征在于,包括以下步骤S1.产生对称密钥,并储存于存储器;S2.将产生的对称密钥值混沌映射,以产生混沌值;S3.将所述混沌值舍位,并将部分混沌值反向;S4.将所述混沌值合并组成虚拟密钥;S5.明文和所述虚拟密钥进行运算得到密文。
2、 一种应用混沌密码流解密的方法,其特征在于,包括以下步骤51. 将所述对称密钥值混沌映射,以产生混沌值;52. 将所述混沌值舍位,并将部分混沌值反相;53. 将所述混沌值合并组成虚拟密钥;54. 密文和所述虚拟密钥进行运算得到明文。
3、 一种混沌密码流加密的系统,其特征在于,包括下述装置 产生对称密钥的随机数字生成装置-,用于存储所述随机数字生成装置产生的对称密钥的存储器; 将产生的对称密钥值混沌映射,以产生混沌值的混沌映射装置; 将所述混沌值舍位,并将部分混沌值反向的转换装置; 将所述混沌值合并组成虚拟密钥的密钥生成装置; 将明文和所述虚拟密钥进行运算得到密文的加密装置。
4、 一种混沌密码流解密的系统,其特征在于,包括下述装置 将存储器中的对称密钥值进行混沌映射,以产生混沌值的混沌映射装置: 将所述混沌值舍位,并将部分混沌值反向的转换装置; 将所述混沌值合并组成虚拟密钥的密钥生成装置; 将密文和所述虚拟密钥进行运算以得到明文的解密装置。
全文摘要
一种应用混沌密码流加密的方法和系统,通过将产生的混沌密码流与明文数据进行运算加密,并通过将密文数据与所述混沌密码流进行异或操作而解密。本发明的加密方法完全取决于初始参数,因此,在非法解密者不知道初始参数的情况下更难被解密。此外,本发明提出的方法和系统还可应用于任何需要加密的领域。
文档编号G06F21/00GK101216868SQ200710072919
公开日2008年7月9日 申请日期2007年1月5日 优先权日2007年1月5日
发明者李树德 申请人:李树德
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1