5.4 密钥衍生函数

不对称的加密算法定义密钥的性质以及生成密钥的方法,因为密钥需要相互关联。例如,RSA密钥生成算法是确定性的。

对称的加密算法只定义密钥长度。密钥由用户来生成。有多种算法生成密钥,其中一种是KDF。

密钥衍生函数(KDF) 是用于从一些密值(例如主密钥、密码)中衍生对称密钥的确定性算法。有多种类型的KDF,例如bcrypt、crypt、PBKDF2、scrypt、HKDF等。如要学习更多KDF的相关知识,请访问https://en.wikipedia.org/wiki/Key_derivation_function

为了从一个密值生成多个密钥,可以对一个数执行拼接(concatenate)和递增(increment)运算。

基于密码的密钥衍生函数用一个密码生成一个对称密钥。由于在实践中,用户通常使用较弱的密码,基于密码的密钥衍生函数 比较慢,占用了大量内存,使其难以启动强力攻击和其他攻击。基于密码的密钥衍生函数使用广泛,因为难以记住密钥,且存储也有风险——有可能被盗。 PBKDF2是一个基于密码的密钥衍生函数的例子。

主密钥或者密码难以使用强力攻击破解;因此,如果你想从主密钥或者密码生成一个对称密钥,可以使用不以密码为基础的密钥衍生函数,例如HKDF。HKDF比PBKDF2快得多。

为什么使用KDF,而不使用哈希函数?

哈希功能的输出可以当作对称密钥加密技术使用。所以你肯定在奇怪为什么需要KDF。如果使用的是主密钥、密码或者强密码,那么使用一个哈希函数就行了。例如,HKDF仅使用哈希函数生成密钥。但是如果不能保证用户使用强密码,最好使用哈希函数衍生的密码。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=558

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是Python 5.4版本实现isprime函数的代码示例: ```python def isprime(n): """ 判断一个数是否为质数 """ if n <= 1: return False for i in range(2, int(n ** .5) + 1): if n % i == : return False return True ``` 该函数接受一个整数n作为参数,返回一个布尔值,表示n是否为质数。如果n小于等于1,则直接返回False;否则,从2开始遍历到n的平方根,如果n能被任何一个小于等于它平方根的数整除,则说明n不是质数,返回False;否则,说明n是质数,返回True。 ### 回答2: Python 5.4实现isprime函数非常简单,只需要使用循环和判断语句即可。 首先,我们需要明确isprime函数的作用,即判断一个数是否为质数。质数是指只能被1和本身整除的正整数,例如2、3、5、7、11等数都是质数。 其次,我们可以使用一个循环语句遍历2到n-1之间的所有正整数,判断该数是否能被n整除。如果能被整除,则说明n不是质数,否则n是质数。 最后,我们可以将该函数封装起来,使其可以接收任意一个正整数作为参数,返回该数是否为质数的结果。 下面是一个简单的代码示例: def isprime(n): """ 判断一个正整数是否为质数 """ # 小于等于1的数不是质数 if n <= 1: return False # 遍历2到n-1之间的所有正整数 for i in range(2, n): # 如果n能被i整除,则说明n不是质数 if n % i == 0: return False # 如果能跑到这里,说明n是质数 return True 以上代码中,我们首先判断传入的参数是否小于等于1,因为小于等于1的数都不是质数。然后遍历2到n-1之间的所有正整数,并判断n是否能被i整除。如果能被整除,则返回False,否则遍历完所有正整数后返回True,说明n是质数。 我们可以对该函数进行测试: print(isprime(2)) # True print(isprime(7)) # True print(isprime(10)) # False 可以看到,对于参数2和7,函数返回True,说明它们是质数;对于参数10,函数返回False,说明它不是质数。 ### 回答3: isprime函数的主要功能是判断一个整数是否为素数。素数是指只能被1和自身整除的正整数,例如2、3、5、7等等。 实现isprime函数的方法有很多种,这里介绍一种比较简单易懂的实现方式。 首先,判断一个数字n是否为素数,可以通过循环遍历2~n-1之间的所有数字,分别除以n,并检查余数是否为零。如果余数为零,则n不是素数,否则n是素数。但是,这种方法时间复杂度较高,当n很大时,循环次数会非常多,效率很低。 因此,我们可以采用更高效的方法:判断n是否为素数,只需要判断2~sqrt(n)之间的数字是否能够整除n即可。因为如果n能够被2~sqrt(n)之间的某个数整除,那么n就不是素数。如果都不能整除,那么n就是素数。这种方法的时间复杂度要比前一种方法低得多。 下面是一个简单的Python代码实现: ```python def isprime(n): if n <= 1: # 1不是素数 return False if n == 2: # 特判2是素数 return True if n % 2 == 0: # 偶数不是素数 return False for i in range(3, int(n**0.5)+1, 2): # 只需遍历奇数 if n % i == 0: return False return True # 如果未被整除,n是素数 ``` 其中,判断n是否为偶数,可以直接使用%n==0的方式,如果余数为零,则n是偶数。另外,特判n=2是素数的情况,如果n=2,则直接返回True即可。 在循环中,我们只检查3~sqrt(n)之间的奇数,因为2我们已经特判掉了。这样可以节省循环次数,提高效率。 最后,如果循环未找到能够整除n的数字,则n是素数。如果循环中出现了整除n的数字,则n不是素数。 以上就是一个简单的Python实现isprime函数的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值