导航:首页 > 文档加密 > 密码学教程pdf

密码学教程pdf

发布时间:2025-04-02 01:02:48

① 现代密码学教程内容简介

《现代密码学教程》是一本深入浅出的密码学入门教材,分为11章和1个附录,内容结构清晰。首先,第1至3章是基础知识篇,涵盖了密码学的基本概念、常用体制、核心思想以及相关的理论知识,为后续学习奠定基础。


第4至7章深入探讨密码学的基本技术,包括对称密码(如分组密码和序列密码)、Hash函数以及公钥密码技术,这些是密码学实践中的关键环节。


接着,第8至10章聚焦于密码学的实际应用,如数字签名技术、密钥管理和密码协议,帮助读者理解密码学在信息安全中的实际作用。


最后,第11章展望了现代密码学的未来发展方向,为读者展示了该领域的前沿动态和潜在机遇。这本书以其重点突出、易于理解的特性,适合信息科学专业的本科生和研究生作为专业基础教材,也适合教师、科研人员和工程技术人员作为参考书籍,丰富例证和多样习题有助于深入学习和牢固掌握密码学知识。




(1)密码学教程pdf扩展阅读

《现代密码学教程》,坐着谷利泽、杨义先,北京邮电大学出版社2009年08月出版,信息安全专业的专业基础课教材,是一本介绍现代密码学基础知识、基本技术以及应用的书籍。

② 密码学系列之:bcrypt加密算法详解

简介

今天要给大家介绍的一种加密算法叫做bcrypt,bcrypt是由NielsProvos和DavidMazières设计的密码哈希函数,他是基于Blowfish密码而来的,并于1999年在USENIX上提出。

除了加盐来抵御rainbowtable攻击之外,bcrypt的一个非常重要的特征就是自适应性,可以保证加密的速度在一个特定的范围内,即使计算机的运算能力非常高,可以通过增加迭代次数的方式,使得加密速度变慢,从而可以抵御暴力搜索攻击。

bcrypt函数是OpenBSD和其他系统包括一些Linux发行版(如SUSELinux)的默认密码哈希算法。

bcrypt的工作原理

我们先回顾一下Blowfish的加密原理。blowfish首先需要生成用于加密使用的K数组和S-box,blowfish在生成最终的K数组和S-box需要耗费一定的时间,每个新的密钥都需要进行大概4KB文本的预处理,和其他分组密码算法相比,这个会很慢。但是一旦生成完毕,或者说密钥不变的情况下,blowfish还是很快速的一种分组加密方法。

那么慢有没有好处呢?

当然有,因为对于一个正常应用来说,是不会经常更换密钥的。所以预处理只会生成一次。在后面使用的时候就会很快了。

而对于恶意攻击者来说,每次尝试新的密钥都需要进行漫长的预处理,所以对攻击者来说要破解blowfish算法是非常不划算的。所以blowfish是可以抵御字典攻击的。

Provos和Mazières利用了这一点,并将其进一步发展。他们为Blowfish开发了一种新的密钥设置算法,将由此产生的密码称为"Eksblowfish"("expensivekeyscheleBlowfish")。这是对Blowfish的改进算法,在bcrypt的初始密钥设置中,salt和password都被用来设置子密钥。然后经过一轮轮的标准Blowfish算法,通过交替使用salt和password作为key,每一轮都依赖上一轮子密钥的状态。虽然从理论上来说,bcrypt算法的强度并不比blowfish更好,但是因为在bcrpyt中重置key的轮数是可以配置的,所以可以通过增加轮数来更好的抵御暴力攻击。

bcrypt算法实现

简单点说bcrypt算法就是对字符串OrpheanBeholderScryDoubt进行64次blowfish加密得到的结果。有朋友会问了,bcrypt不是用来对密码进行加密的吗?怎么加密的是一个字符串?

别急,bcrpyt是将密码作为对该字符串加密的因子,同样也得到了加密的效果。我们看下bcrypt的基本算法实现:

FunctionbcryptInput:cost:Number(4..31)log2(Iterations).e.g.12==>212=4,096iterationssalt:arrayofBytes(16bytes)randomsaltpassword:arrayofBytes(1..72bytes)UTF-8encodedpasswordOutput:hash:arrayofBytes(24bytes)////P:arrayof18subkeys(UInt32[18])//S:Foursubstitutionboxes(S-boxes),S0...S3.EachS-boxis1,024bytes(UInt32[256])P,S<-EksBlowfishSetup(cost,salt,password)//Repeatedlyencryptthetext"OrpheanBeholderScryDoubt"64timesctext<-"OrpheanBeholderScryDoubt"//24bytes==>three64-bitblocksrepeat(64)ctext<-EncryptECB(P,S,ctext)////24-(cost,salt,ctext)

上述函数bcrypt有3个输入和1个输出。

在输入部分,cost表示的是轮循的次数,这个我们可以自己指定,轮循次数多加密就慢。

salt是加密用盐,用来混淆密码使用。

password就是我们要加密的密码了。

最后的输出是加密后的结果hash。

有了3个输入,我们会调用EksBlowfishSetup函数去初始化18个subkeys和4个1K大小的S-boxes,从而达到最终的P和S。

然后使用P和S对"OrpheanBeholderScryDoubt"进行64次blowfish运算,最终得到结果。

接下来看下EksBlowfishSetup方法的算法实现:

FunctionEksBlowfishSetupInput:password:arrayofBytes(1..72bytes)UTF-8encodedpasswordsalt:arrayofBytes(16bytes)randomsaltcost:Number(4..31)log2(Iterations).e.g.12==>212=4,096iterationsOutput:P:arrayofUInt32arrayof18per-roundsubkeysS1..S4:;eachSBoxis256UInt32(i.e.1024KB)//InitializeP(Subkeys),andS(Substitutionboxes)withthehexdigitsofpiP,S<-InitialState()//,S<-ExpandKey(P,S,salt,password)//Thisisthe"Expensive"partofthe"ExpensiveKeySetup".//.repeat(2cost)P,S<-ExpandKey(P,S,0,password)P,S<-ExpandKey(P,S,0,salt)returnP,S

代码很简单,EksBlowfishSetup接收上面我们的3个参数,返回最终的包含18个子key的P和4个1k大小的Sbox。

首先初始化,得到最初的P和S。

然后调用ExpandKey,传入salt和password,生成第一轮的P和S。

然后循环2的cost方次,轮流使用password和salt作为参数去生成P和S,最后返回。

最后看一下ExpandKey的实现:

FunctionExpandKeyInput:password:arrayofBytes(1..72bytes)UTF-8encodedpasswordsalt:Byte[16]randomsaltP:..S4:UInt32[1024]Four1KBSBoxesOutput:P:arrayofUInt32Arrayof18per-roundsubkeysS1..S4:UInt32[1024]Four1KBSBoxes//<-1to18doPn<-Pnxorpassword[32(n-1)..32n-1]//treatthepasswordascyclic//Treatthe128-bitsaltastwo64-bithalves(theBlowfishblocksize).saltHalf[0]<-salt[0..63]//Lower64-bitsofsaltsaltHalf[1]<-salt[64..127]//Upper64-bitsofsalt//Initializean8-byte(64-bit)bufferwithallzeros.block<-0//MixinternalstateintoP-boxesforn<-1to9do//xor64-bitblockwitha64-bitsalthalfblock<-blockxorsaltHalf[(n-1)mod2]//[0],andsaltHalf[1]//<-Encrypt(P,S,block)P2n<-block[0..31]//lower32-bitsofblockP2n+1<-block[32..63]//upper32-bitsblock//-boxesofstatefori<-1to4doforn<-0to127doblock<-Encrypt(state,blockxorsalt[64(n-1)..64n-1])//asaboveSi[2n]<-block[0..31]//lower32-bitsSi[2n+1]<-block[32..63]//upper32-bitsreturnstate

ExpandKey主要用来生成P和S,算法的生成比较复杂,大家感兴趣的可以详细研究一下。

bcrypthash的结构

我们可以使用bcrypt来加密密码,最终以bcrypthash的形式保存到系统中,一个bcrypthash的格式如下:

$2b$[cost]$[22charactersalt][31characterhash]

比如:

$2a$10$\__//\____________________/\_____________________________/AlgCostSaltHash

上面例子中,$2a$表示的hash算法的唯一标志。这里表示的是bcrypt算法。

10表示的是代价因子,这里是2的10次方,也就是1024轮。

N9qo8uLOickgx2ZMRZoMye是16个字节(128bits)的salt经过base64编码得到的22长度的字符。

最后的是24个字节(192bits)的hash,经过bash64的编码得到的31长度的字符。

hash的历史

这种hash格式是遵循的是OpenBSD密码文件中存储密码时使用的MolarCryptFormat格式。最开始的时候格式定义是下面的:

$1$:MD5-basedcrypt('md5crypt')

$2$:Blowfish-basedcrypt('bcrypt')

$sha1$:SHA-1-basedcrypt('sha1crypt')

$5$:SHA-256-basedcrypt('sha256crypt')

$6$:SHA-512-basedcrypt('sha512crypt')

但是最初的规范没有定义如何处理非ASCII字符,也没有定义如何处理null终止符。修订后的规范规定,在hash字符串时:

String必须是UTF-8编码

必须包含null终止符

因为包含了这些改动,所以bcrypt的版本号被修改成了$2a$。

但是在2011年6月,因为PHP对bcypt的实现crypt_blowfish中的一个bug,他们建议系统管理员更新他们现有的密码数据库,用$2x$代替$2a$,以表明这些哈希值是坏的(需要使用旧的算法)。他们还建议让crypt_blowfish对新算法生成的哈希值使用头$2y$。当然这个改动只限于PHP的crypt_blowfish。

然后在2014年2月,在OpenBSD的bcrypt实现中也发现了一个bug,他们将字符串的长度存储在无符号char中(即8位Byte)。如果密码的长度超过255个字符,就会溢出来。

因为bcrypt是为OpenBSD创建的。所以当他们的库中出现了一个bug时,他们决定将版本号升级到$2b$。

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:“程序那些事”,懂技术,更懂你!

阅读全文

与密码学教程pdf相关的资料

热点内容
电脑微信聊天记录怎么加密了 浏览:792
免费学画画的app哪个最好 浏览:966
怎么新建一个php文件 浏览:570
宁波python 浏览:347
美团程序员椅子 浏览:838
增加服务器是什么意思 浏览:687
丰田压缩机转速 浏览:483
加密的行业 浏览:258
app图形化编程语言 浏览:797
影响云服务器的因素有哪些 浏览:687
修改编译后c的文件 浏览:705
8051单片机步进电机 浏览:974
eve箱子已加密 浏览:454
python3eval函数 浏览:746
丹阳哪个app最好 浏览:429
w3m命令 浏览:982
mongodbphp操作类 浏览:988
如何用好压压缩文件 浏览:586
程序员应该如何选择下家公司 浏览:527
为什么建网站要用服务器 浏览:69