在
counter必须返回相同的解密,因为它没有加密,你直觉,所以,一个( 不安全AT ALL )的方式来做到这一点是:
>>> secret = os.urandom(16)>>> crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=lambda: secret)>>> encrypted = crypto.encrypt("aaaaaaaaaaaaaaaa")>>> print crypto.decrypt(encrypted)aaaaaaaaaaaaaaaa
点击率是一种 分组 密码,因此“ 16次”约束似乎很自然,这让您感到惊讶。
当然,在每次调用中返回 相同
值的所谓“计数器”是完全不安全的。不需要花费太多就可以做得更好,例如:
import arrayclass Secret(object): def __init__(self, secret=None): if secret is None: secret = os.urandom(16) self.secret = secret self.reset() def counter(self): for i, c in enumerate(self.current): self.current[i] = c + 1 if self.current: break return self.current.tostring() def reset(self): self.current = array.array('B', self.secret)secret = Secret()crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=secret.counter)encrypted = crypto.encrypt(16*'a' + 16*'b' + 16*'c')secret.reset()print crypto.decrypt(encrypted)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)