面试问题-密码

Posted Pam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试问题-密码相关的知识,希望对你有一定的参考价值。

信达雅

MAC和Hash的区别?

  • MAC:消息验证码
  • Hash:消息摘要/杂凑

主动攻击是指攻击者通过假冒、重放、篡改、拒绝等方式完成攻击。

消息认证可以抵抗主动攻击,可以验证接收消息的真实性、完整性、顺序性和时间性;数字签名也可抗主动攻击,用于验证消息的不可否认性。

消息认证和数字签名机制都会产生认证符。认证符是用于认证消息的数值,产生方式又可以分为消息验证码和哈希函数。

MAC

消息认证码是指消息「\\(M\\)」被一个密钥「\\(K\\)」控制的公开函数「\\(C_K(M)\\)」作用后产生的、用于认证符的、固定长度的数值,也被称为密码校验和\\(MAC\\)」。

如何使用?

假设通信双方共享一个密钥\\(K\\),设\\(A\\)预发送给\\(B\\)的消息是\\(M\\)

  • \\(A\\)先计算\\(MAC=C_K(M)\\),并将\\(M || MAC\\)发送给\\(B\\)
  • \\(B\\)收到后对\\(M\\)做相同的运算,得到一个新的\\(MAC\\),并与收到的\\(MAC\\)比较

可以看出\\(MAC\\)实现了消息的:

  • 完整性:接收方相信发送方发来的消息是未被篡改的
  • 真实性:接收方相信发送方不是冒充的

MAC函数和加密函数的区别?

  • MAC函数不必是可逆的,因此与加密算法相比,更加不容易攻破!
  • 消息认证码的穷搜索攻击比对使用相同长度密钥的加密算法的穷搜索攻击的代价要更大。

补充:加密算法的安全性

加密算法「对称或者公钥」的安全性一般取决于密钥的长度。如果加密算法没有弱点,则敌手只能使用穷搜索攻击以测试所有可能的密钥,如果密钥长度为\\(k\\)比特,则穷搜索攻击平均进行\\(2^k-1\\)个测试。

DES数据认证算法

CBC模式的DES算法为例,其初始向量为零向量,需被认证的数据(消息、记录、文件、程序)被分为64比特长的分组\\(D_1,...,D_N\\),其中如果最后一个分组不够64比特,则补0,然后计算数据认证码:

\\(O_1=E_K\\left(D_1\\right)\\)

\\(O_2=E_K\\left(D_2\\oplus O_1\\right)\\)

\\(O_3=E_K\\left(D_3\\oplus O_2\\right)\\)

\\(...\\)

\\(O_N=E_K\\left(D_N\\oplus O_N-1\\right)\\)

数据认证码为\\(O_N\\)或者\\(O_N\\)的最左\\(M\\)个比特,其中\\(16<=M<=64\\)

ZUC数据认证算法

ZUC的完整性算法128-EIA3是消息认证码函数,用于为输入的消息使用完整性密钥\\(IK\\)产生的\\(MAC\\)

  • 输入

  • 输出

  • 算法

(1)根据参数按照一定规则产生初始向量\\(IV\\)

(2)以完整性密钥\\(IK\\)作为ZUC算法的密钥,执行ZUC算法产生出长度为\\(L\\)的32位密钥字节流\\(Z_0,...,Z_L-1\\)

(3)把\\(Z_0,...,Z_L-1\\)看成二进制比特流,从\\(Z_0\\)首位开始逐比特向后形成一系列新的32位密钥流,并在消息比特流的控制下进行累加,最后再加上\\(Z_L-1\\),便产生消息认证码\\(MAC\\)

具体参考:国密复习

Hash函数

哈希函数\\(H\\)是一个公开函数,用于将任意长的消息\\(M\\)映射为较短的、固定长度的一个值\\(H(M)\\),作为认证符,称函数\\(H(M)\\)为哈希值或消息摘要值。

Hash函数的特点:

  • 单向性
  • 输入任意,输出固定

HMAC

将Hash函数用于构造MAC方法,HMAC中Hash函数作为一个黑盒,容易替换。

输入消息\\(M\\)\\(Y_i\\)\\(M\\)的第\\(i\\)个分组,\\(L\\)是分组数,\\(b\\)是一个分组中的比特数,\\(n\\)是哈希函数输出的长度,\\(K\\)是密钥,若密钥长度大于\\(b\\),则将密钥输入到哈希函数中产生一个\\(n\\)比特长的密钥,\\(K^+\\)是左边经填充\\(0\\)后的\\(K\\),长度为\\(b\\)比特,\\(ipad\\)\\(b/8\\)个00110110,\\(opad\\)\\(b/8\\)个01011010。

最终:\\(H M A C_k=H\\left[\\left(K^+\\opluso p a d\\right)\\parallel H\\left[\\left(K^+\\oplusi p a d\\right)\\parallelM\\right]\\right]\\)

HMAC的安全性取决于其中使用哈希函数的安全性。

椭圆曲线上倍点运算的几何解释?

给出椭圆曲线方程的定义:\\(y^2+axy+by=x^3+cx^2+dx+e\\),其中\\(a,b,c,d,e\\)是满足某些条件的实数。

下面是两个例子:

有图可知:椭圆曲线关于\\(x\\)轴对称,记椭圆曲线上的无穷远点为\\(O\\)

椭圆曲线上的加法运算:若曲线上的三个点位于同一条直线上,则它们的和为\\(O\\)

  • \\(O\\)为加法单位元,即对椭圆曲线上的任一点\\(P\\),都有\\(P+O=P\\)
  • \\(P_1=(x,y)\\)是椭圆曲线上的一点,则它的加法逆元为\\(P_2=-P_1=(x,-y)\\)
    • 因为\\(P_1\\)\\(P_2\\)的连线延长到无穷远点时,得到椭圆曲线上的另外一点\\(O\\),即曲线上三点\\(P_1,P_2,O\\)共线,所以\\(P_1+P_2+O=O\\to P_1+P_2=O\\to P_1=-P_2\\)
    • \\(O+O=O\\),得\\(O=-O\\)
  • 「加法」设\\(Q\\)\\(R\\)是椭圆曲线上的\\(x\\)坐标不同的两点,\\(Q+R\\)的定义为:一条通过\\(Q、R\\)的直线,与椭圆曲线交于\\(P_1\\),由\\(Q+R+P_1=O\\),得\\(Q+R=-P_1\\)
    • 这个交点是唯一的,除非所做的直线是\\(P\\)点或\\(R\\)点的切点,此时为\\(P_1=Q\\)\\(P_1=R\\)
  • 「倍点」点\\(Q\\)的倍点定义:在\\(Q\\)点做的椭圆曲线的一条切线,设切线与椭圆曲线交于点\\(S\\),则定义\\(2Q=Q+Q=-S\\),类似的有\\(3Q=Q+Q+Q,....\\)

查看文件的具体行命令?

  • cat 文件 :查看文件内容
    • cat > 文件:创建文件
    • cat file1 file2 > file:合并文件
    • cat -n file1 >> file2:追加文件
    • cat : >file :清空文件
  • tac 文件:反向显示
  • sed 文件:查看文件内容的特定一段,根据时间或者行号范围查找
    • sed -n \'5,10p\' file:查看文件第5行到第10行的内容
    • sed -n \'/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p\' file:按照时间段查看日志
  • head -n 文件:查看文件前\\(n\\)行,默认为10行
  • tail -n 文件:查看文件后\\(n\\)行,默认为10行
    • tail -f 文件:动态查看文件内容
  • less 文件:以较少内容展示,按辅助键(数字+回车、空格+上下)

  • more 文件:以较多内容展示,按辅助键(数字+回车、空格+上下)

  • wc -l 文件:统计文件内容的行数

    • -w :统计文件内容的单词数
    • -c:统计文件内容的字节数
  • 查看文件中的内容:cat 文件 | grep “内容”
  • vim查看文件内容:/“内容”,在搜索结果中切换上/下一个结果 :N/n

SM4如何做完整性验证?

传统构造MAC的方法使用的是分组密码,正如上面提到的「DES数据认证算法」,使用CBC模式下的SM4构造MAC算法如下:

需要被认证的数据被分为128比特长的分组\\(D_1,...,D_N\\),其中若最后一个分组不够128比特,则补零,通过下面的方式计算数据认证码,数据认证码为\\(O_N\\)或者\\(O_N\\)的最左\\(M\\)个比特:

\\(O_1=E_K\\left(D_1\\right)\\)

\\(O_2=E_K\\left(D_2\\oplus O_1\\right)\\)

\\(O_3=E_K\\left(D_3\\oplus O_2\\right)\\)

\\(...\\)

\\(O_N=E_K\\left(D_N\\oplus O_N-1\\right)\\)

银行卡中心

分组模式的应用场景?

  • CTR模式:不需要填充,代码实现起来很方便,而且加密和解密的方法是一样的,并且可以实现并发分组,效率高,安全性也有保障,被广泛用于 ATM 网络安全和IPSec应用中

参考

1、现代密码学-杨波

以上是关于面试问题-密码的主要内容,如果未能解决你的问题,请参考以下文章

2019面试小记

字节面试官:mysql重置密码

用例设计面试题

程序员面试闪充--密码学

最全SpringBoot学习教程:linux查看mysql初始密码

面试必知的SQL数据库命令