信息安全-4:公钥密码体制之背包算法[原创]

转发注明出处:http://www.cnblogs.com/0zcl/p/6111686.html

前言

本来我是想学RSA算法的,但发现太难了,不是我能理解的,于是我先看教材前面的背包算法。不出意料的话会在下一篇博客介绍下RSA算法!

背包问题介绍:

给定一些物体,每个物体有不同的重量,是否有可能将这些物体放入一个背包,使背包的重量等于一个给定的值。

  • 背包算法为第一个推广的公开密钥加密算法。
  • 虽然后来发现这个算法不安全,但仍值得研究,因为它表示了如何将NP完全问题用于公开密钥算法(好吧,这个我不知道是什么意思~)。

举例:

这些物体的重量分别为1,5,6,11,14,20,则可将重5,6,11的物体放入,装成一个重22的背包。但是无法装成一个重24的背包。

  • 背包问题:等于一个给定的值。
  • 解为选择物品装入的情况,装入用1,未装入用0.例子中对给定值22的解为{0,1,1,1,0,0}
  • 这个问题需要的时间随物体的数量的增加成指数时间。

基本原理

这个算法我没有编程,时值考试月,时间紧张,等我有时间再回来搞~

首先,背包算法用于信息安全(密码法),我们总得搞清楚什么是明文,密文,密钥吧?!

举例:

明文: 1  1  1  0  0  1     0  1  0  1  1  0      0  1  1  0  0  0

密钥: 1  5  6  11  14  20   1  5  6  11  14  20    1  5  6  11  14  20

密文: 1+5+6+20=32      5+11+14=30       5+6=11

从上面可以总结:

  • 明文为物品的装入情况,是1/0的序列,而且明文长度等于物体的个数,表示从中选取物体装入背包
  • 密文为选取物体的质量和
  • 密钥为背包问题中物品重量序列

算法安全性体现为:

若攻击者获得密文、密钥,也无法在线性时间内求明文(物品的装入情况)

算法的关键

算法的关键是有两个不同的背包重量序列,这两个重量序列对于给定的相同的值,解相同(物品的装入情况相同)

前者物品的重量列表是递增的,后者则是无序的

前者可以解密,看下面~~

1、构造递增序列背包

易解的背包问题:若物品的重量列表为一个超递增序列,则该背包问题很容易解的。

比如递增序列:1  3  6  13  27  52

 举例:

  • 非递增背包是一个难问题
  • 背包算法先找到一个递增背包的重量序列作为私钥,再由此构造一个序列(有相同解的一般背包问题的序列)作为公钥(重要!)

如何构造公钥呢?

2、从私钥构造公钥

经过上面的计算,序列为:{62  93  81  88  102  37}作为公钥

 3、加密

4、解密

解密这里我遇到一个问题:如何求n-1,即如何求n关于模m的逆元??(注意:这里必须搞懂,不然下一篇博客RSA算法就肯定不懂的!)

我百度找了好多,也看了别了的博客,比如http://blog.sina.com.cn/s/blog_65a5cf5e0100nyqo.html,但我看不懂啊!!终于我找到了一个我能看懂的求逆元方法<辗转相除法求模的逆元>!(已经编程实现),下篇博客会发出来~~

为了方便我整理,我把求逆元相关的过程截图出来,大家也可以点链接去看~  ending~

……

时间: 2024-10-03 22:29:58

信息安全-4:公钥密码体制之背包算法[原创]的相关文章

背包算法解决一道华为面试题

闲来无事,看到了一篇文章,华为面试题,题目如下: 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小 网址是http://bbs.chinaunix.net/thread-855126-1-1.html这个. 估计多数人想到的都是先sort,再交叉,或者一条龙什么的,包括我.后来一想不对啊,如果前面的都是个位数,最后一个是999怎么办? 抱着学习的态度一页一页往下翻,好多人都是在提出来自己想法,但是我拿我这个999验

【密码学】RSA公钥密码体制

RSA公钥密码体制是美国麻省理工学院(MIT)的三位科学家Rivest.Shamir.Adleman于1978年提出的,简称RSA公钥秘密系统.实际上,RSA稍后于MH背包公钥密码实用系统,但它的影响超过了MH密码体系.它是一个根据理论模型可以进行应用设计的公钥密码实用系统.RSA体制的理论基础是数论的欧拉函数,安全性依据是:求两个大素数乘积是计算上容易的,但要分解大数的素因子是困难的.因此是迄今为止仍被认为一个最有影响的密码体制.

基于私钥加密公钥解密的RSA算法C#实现方法

本文实例讲述了基于私钥加密公钥解密的RSA算法C#实现方法,是一种应用十分广泛的算法.分享给大家供大家参考之用.具体方法如下: 一.概述 RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 1

01背包算法的理解

01背包问题: 有N件物品和一个最大重量限制为V的背包.第i件物品的重量是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的重量总和不超过V,且价值总和最大.每个物品只有1份,且不可分割 看了01背包算法,言简意赅,但理解起来头昏脑胀,不得要领.尝试解释下对该算法的理解,加深记忆. 假设最优解已经存在,怎么判断一个物品i是否在背包里?  简单,只要知道, 1.c[i]是否大于V, 2.F[i-1][V-c[i]],即没有i物品的情况下,最大重量限制为V-c[i]的最优解. 3.F[i

用coffee和socket.io实现的01背包算法

先说说我为什么写这些吧 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了. 这学期明显没把心放在前端上--汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事. 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态. 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评. 兴许因为哪篇文章能解决工作呢. 我想试试Mar

背包算法练习--求小于某数字的数组最大和:

////背包算法练习--求小于某数字的数组最大和: var bestS = {val:0,str:""}; var LIMIT ; Array.prototype.sum = function(){ var s = 0; for(var i = 0;i < this.length;i++){ s+= this[i]; } return s; } function f(bagArr){ var arrS = bagArr.sum(); if(arrS < LIMIT){ be

信息安全-2:python之hill密码算法[原创]

转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做,不过我觉得会加密就会解密的~~       一.hill算法原理 hill密码是一种多字母替代密码,由数学学Leste Hill于1929年研制成功.该密码算法取m个连续的明文字母,并用m个密文字母代替,用向量或矩阵表示为(这里取m=3,C和P是长度为3的列向量,K是3*3矩阵): 即:C=KP  

基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价.    RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 100个十进制位)的函数.据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积.     密钥对的产生.选择两个大素数,p

01背包算法

转:01背包问题 动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录